¿Cuál es la mejor manera de hacer un groupby en un dataframe de Pandas, pero excluyendo algunas columnas de ese groupby? por ejemplo, tengo el siguiente dataframe: ``ninguno Código País Item_Code Item Ele_Code Unidad Y1961 Y1962 Y1963 2 Afganistán 15 Trigo 5312 Ha 10 20 30 2 Afganistán 25 Maíz 5312 Ha 10 20 30 4 Angola 15 Trigo 7312 Ha 30 40 50 4 Angola 25 Maíz 7312 Ha 30 40 50
Quiero agrupar por la columna País y Código_de_artículo y calcular sólo la suma de las filas correspondientes a las columnas Y1961, Y1962 e Y1963. El marco de datos resultante debería tener el siguiente aspecto
```ninguno
Código País Item_Code Item Ele_Code Unidad Y1961 Y1962 Y1963
2 Afganistán 15 C3 5312 Ha 20 40 60
4 Angola 25 C4 7312 Ha 60 80 100
En este momento estoy haciendo esto:
df.groupby('Country').sum()
Sin embargo, esto suma los valores de la columna Item_Code también. ¿Hay alguna forma de especificar qué columnas incluir en la operación sum()
y cuáles excluir?
Puede seleccionar las columnas de un groupby:
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
Nota que la lista pasada debe ser un subconjunto de las columnas, de lo contrario verá un KeyError.
La función agg
lo hará por ti. Pasa las columnas y la función como un dict con columna, salida:
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
Esto mostrará sólo el grupo por columnas, y las columnas agregadas especificadas. En este ejemplo he incluido dos funciones agg aplicadas a 'Y1962'.
Para obtener exactamente lo que esperaba ver, incluya las otras columnas en el grupo por, y aplique sumas a las variables Y en el marco:
df.groupby(['Code', 'Country', 'Item_Code', 'Item', 'Ele_Code', 'Unit']).agg({'Y1961': np.sum, 'Y1962': np.sum, 'Y1963': np.sum})
Si buscas una forma más generalizada de aplicarlo a muchas columnas, lo que puedes hacer es construir una lista de nombres de columnas y pasarla como índice del dataframe agrupado. En tu caso, por ejemplo:
columns = ['Y'+str(i) for year in range(1967, 2011)]
df.groupby('Country')[columns].agg('sum')