Pandas – dataframe groupby – cómo obtener la sum de varias columnas

Esto debería ser fácil, pero de alguna manera no pude encontrar una solución que funcione.

Tengo un dataframe de pandas que se ve así:

index col1 col2 col3 col4 col5 0 ac 1 2 f 1 ac 1 2 f 2 ad 1 2 f 3 bd 1 2 g 4 be 1 2 g 5 be 1 2 g 

Quiero agrupar por col1 y col2 y obtener la sum() de col3 y col4. Col5 se puede eliminar, ya que los datos no se pueden agregar.

Aquí es cómo debe verse la salida. Estoy interesado en tener tanto col4 como col4 en el dataframe resultante. Realmente no importa si col1 y col2 son parte del índice o no.

 index col1 col2 col3 col4 0 ac 2 4 1 ad 1 2 2 bd 1 2 3 be 2 4 

Esto es lo que intenté:

 df_new = df.groupby(['col1', 'col2'])["col3", "col4"].sum() 

Sin embargo, eso solo devuelve los resultados agregados de col4 .

Estoy perdido aquí. Todos los ejemplos que encontré solo agregan una columna, donde el problema obviamente no ocurre.

Mediante el uso de apply

 df.groupby(['col1', 'col2'])["col3", "col4"].apply(lambda x : x.astype(int).sum()) Out[1257]: col3 col4 col1 col2 ac 2 4 d 1 2 bd 1 2 e 2 4 

Si quieres agg

 df.groupby(['col1', 'col2']).agg({'col3':'sum','col4':'sum'}) 

Otra solución genérica es

 df.groupby(['col1','col2']).agg({'col3':'sum','col4':'sum'}).reset_index() 

Esto le dará la salida requerida.

El problema es probable que df.col3.dtype probablemente no sea un tipo de datos int o numérico. Pruebe df.col3 = df.col3.astype(int) antes de hacer su groupby

Además, seleccione sus columnas después del grupo para ver si las columnas incluso se están agregando:

 df_new = df.groupby(['col1', 'col2']).sum()[["col3", "col4"]] 

La respuesta anterior no funcionó para mí.

 df_new = df.groupby(['col1', 'col2']).sum()[["col3", "col4"]] 

Estaba agrupando por un solo grupo por y sumndo columnas.

Aquí está el que trabajó para mí.

 D1.groupby(['col1'])['col2'].sum() << The sum at the end not the middle.