¿Cuál es la mejor manera de hacer un groupby en un marco de datos de Pandas, pero excluir algunas columnas de ese groupby? por ejemplo, tengo el siguiente marco de datos:
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
Quiero agrupar por la columna Country y Item_Code y solo calcular la suma de las filas que caen debajo de las columnas Y1961, Y1962 e Y1963. El marco de datos resultante debería verse así:
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
Ahora mismo estoy haciendo esto:
df.groupby('Country').sum()
Sin embargo, esto también suma los valores en la columna Item_Code. ¿Hay alguna forma de que pueda especificar qué columnas incluir en la sum()
operación y cuáles excluir?
listColumns = list(df.columns)
luego elimina las columnas que no desealistColumns.remove('Y1964')
y finalmente hace su resumen:df.groupby(['Country', 'Item_Code'])[listColumns].sum()
cannot reindex from a duplicate axis
La
agg
función hará esto por ti. Pase las columnas y funcione como un dictado 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á solo el grupo por columnas y las columnas agregadas especificadas. En este ejemplo incluí dos funciones agg aplicadas a 'Y1962'.
Para obtener exactamente lo que esperaba ver, incluya las otras columnas en el grupo 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})
fuente
Si está buscando una forma más generalizada de aplicar a muchas columnas, lo que puede hacer es crear una lista de nombres de columna y pasarla como índice del marco de datos agrupado. En su caso, por ejemplo:
columns = ['Y'+str(i) for year in range(1967, 2011)] df.groupby('Country')[columns].agg('sum')
fuente