Qual é a melhor maneira de agrupar em um dataframe do Pandas, mas excluir algumas colunas desse agrupamento? por exemplo, eu tenho o seguinte dataframe:
Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963
2 Afghanistan 15 Wheat 5312 Ha 10 20 30
2 Afghanistan 25 Maize 5312 Ha 10 20 30
4 Angola 15 Wheat 7312 Ha 30 40 50
4 Angola 25 Maize 7312 Ha 30 40 50
Desejo agrupar pela coluna Country e Item_Code e apenas calcular a soma das linhas que se enquadram nas colunas Y1961, Y1962 e Y1963. O dataframe resultante deve ser assim:
Code Country Item_Code Item Ele_Code Unit Y1961 Y1962 Y1963
2 Afghanistan 15 C3 5312 Ha 20 40 60
4 Angola 25 C4 7312 Ha 60 80 100
Agora estou fazendo isso:
df.groupby('Country').sum()
No entanto, isso adiciona os valores na coluna Item_Code também. Existe alguma maneira de especificar quais colunas incluir na sum()
operação e quais excluir?
listColumns = list(df.columns)
, remove as colunas que não desejalistColumns.remove('Y1964')
e , por fim, faz sua soma:df.groupby(['Country', 'Item_Code'])[listColumns].sum()
cannot reindex from a duplicate axis
A
agg
função fará isso por você. Passe as colunas e funcione como um dicionário com coluna, saída:df.groupby(['Country', 'Item_Code']).agg({'Y1961': np.sum, 'Y1962': [np.sum, np.mean]}) # Added example for two output columns from a single input column
Isso exibirá apenas o grupo por colunas e as colunas agregadas especificadas. Neste exemplo, incluí duas funções agg aplicadas a 'Y1962'.
Para obter exatamente o que você esperava ver, inclua as outras colunas no agrupamento por e aplique somas às variáveis Y no quadro:
df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
fonte
Se você está procurando uma maneira mais generalizada de aplicar a muitas colunas, o que pode fazer é construir uma lista de nomes de colunas e passá-la como o índice do dataframe agrupado. No seu caso, por exemplo:
columns = ['Y'+str(i) for year in range(1967, 2011)] df.groupby('Country')[columns].agg('sum')
fonte