Qual é a melhor maneira de fazer um grupoby num dataframe Pandas, mas excluir algumas colunas desse grupoby? por exemplo, eu tenho o seguinte dataframe: "ninguém Código País Item_Código Item Ele_Código Unidade Y1961 Y1962 Y1963 2 Afeganistão 15 Trigo 5312 Ha 10 20 30 2 Afeganistão 25 Milho 5312 Ha 10 20 30 4 Angola 15 Trigo 7312 Ha 30 40 50 4 Angola 25 Milho 7312 Ha 30 40 50
Quero agrupar pela coluna País e Item_Código e calcular apenas a soma das linhas que se enquadram nas colunas Y1961, Y1962 e Y1963. O quadro de dados resultante deve ter o seguinte aspecto:
"Nenhum
Código País Item_Código Item Ele_Código Unidade Y1961 Y1962 Y1963
2 Afeganistão 15 C3 5312 Ha 20 40 60
4 Angola 25 C4 7312 Ha 60 80 100
Neste momento, estou a fazer isto:
df.groupby('Country').sum()
No entanto, isto soma também os valores na coluna Item_Code. Existe alguma forma de especificar quais as colunas a incluir na operação sum()
e quais as a excluir?
É possível seleccionar as colunas de um grupo por grupo:
In [11]: df.groupby(['Country', 'Item_Code'])[["Y1961", "Y1962", "Y1963"]].sum()
Out[11]:
Y1961 Y1962 Y1963
Country Item_Code
Afghanistan 15 10 20 30
25 10 20 30
Angola 15 30 40 50
25 30 40 50
Note que a lista aprovada deve ser um subconjunto das colunas, caso contrário você'verá um KeyError.
A função agg
fá-lo-á por si. Passe as colunas e função como um ditado 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
Isto mostrará apenas o grupo por colunas, e as colunas agregadas especificadas. Neste exemplo incluí duas funções de agravamento aplicadas a 'Y1962'.
Para obter exactamente o que esperava ver, inclua as outras colunas no grupo 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})
Se procura uma forma mais generalizada de se aplicar a muitas colunas, o que pode fazer é construir uma lista de nomes de colunas e passá-la como o índice do quadro de dados agrupados. No seu caso, por exemplo:
columns = ['Y'+str(i) for year in range(1967, 2011)]
df.groupby('Country')[columns].agg('sum')