Las pandas sumn por groupby, pero excluyen ciertas columnas.

¿Cuál es la mejor manera de hacer un groupby en un dataframe de Pandas, pero excluir algunas columnas de ese groupby? Por ejemplo, tengo el siguiente 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 

Quiero agrupar por la columna País y Código de artículo y solo calcular la sum de las filas que caen bajo las columnas Y1961, Y1962 y Y1963. El dataframe 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 agrega los valores en la columna Item_Code también. ¿Hay alguna manera en que pueda especificar qué columnas incluir en la operación sum() y cuáles excluir?

Puedes seleccionar las columnas de un grupo por:

 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 

Tenga en cuenta que la lista pasada debe ser un subconjunto de las columnas; de lo contrario, verá un error KeyError.

La función agg hará esto por ti. Pase las columnas y funcione 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á 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 las sums 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 está buscando una forma más general de aplicar a muchas columnas, lo que puede hacer es crear una lista de nombres de columnas y pasarla como el índice del dataframe agrupado. En su caso, por ejemplo:

 columns = ['Y'+str(i) for year in range(1967, 2011)] df.groupby('Country')[columns].agg('sum')