web-dev-qa-db-fra.com

Pandas - dataframe groupby - Comment obtenir la somme de plusieurs colonnes

Cela devrait être facile, mais je n’ai pas réussi à trouver une solution qui fonctionne.

J'ai un pandas dataframe qui ressemble à ceci:

index col1   col2   col3   col4   col5
0     a      c      1      2      f 
1     a      c      1      2      f
2     a      d      1      2      f
3     b      d      1      2      g
4     b      e      1      2      g
5     b      e      1      2      g

Je veux grouper par col1 et col2 et obtenir le sum() de col3 et col4.Col5 Peut être supprimé, car les données ne peuvent pas être agrégées.

Voici à quoi devrait ressembler la sortie. Je suis intéressé à avoir à la fois col3 Et col4 Dans la trame de données résultante. Peu importe que col1 Et col2 Fassent partie de l'index ou non.

index col1   col2   col3   col4   
0     a      c      2      4          
1     a      d      1      2      
2     b      d      1      2      
3     b      e      2      4      

Voici ce que j'ai essayé:

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

Cela ne renvoie toutefois que les résultats agrégés de col4.

Je suis perdu ici. Chaque exemple que j'ai trouvé ne regroupe qu'une colonne, où le problème ne se pose évidemment pas.

15
Axel

En utilisant apply

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

Si vous voulez agg

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

Une autre solution générique est

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

Cela vous donnera la sortie requise.

4
Prateek Sharma

Le problème est probablement que df.col3.dtype N'est probablement pas un type de données int ou numérique. Essayez df.col3 = df.col3.astype(int) avant de faire votre groupby

En outre, sélectionnez vos colonnes après groupby pour voir si elles sont même agrégées:

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

La réponse ci-dessus n'a pas fonctionné pour moi.

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

Je groupais par groupe unique et par colonnes de somme.

Voici celui qui a fonctionné pour moi.

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