J'ai une base de données pandas ci-dessous:

    df

    name    value1    value2  otherstuff1 otherstuff2 
0   Jack       1         1       1.19        2.39     
1   Jack       1         2       1.19        2.39
2   Luke       0         1       1.08        1.08  
3   Mark       0         1       3.45        3.45
4   Luke       1         0       1.08        1.08

Le même "nom" aura la même valeur pour otherstuff1 et otherstuff2.

J'essaie de grouper par colonne 'nom' et somme colonne 'valeur1' et somme colonne 'valeur2' (Pas somme valeur1 avec valeur2 !!! Mais additionnez-les individuellement dans chaque colonne)

S'attendant à obtenir un résultat ci-dessous:

    newdf

    name    value1    value2  otherstuff1 otherstuff2 
0   Jack       2         3       1.19        2.39     
1   Luke       1         1       1.08        1.08  
2   Mark       0         1       3.45        3.45

J'ai essayé

newdf = df.groupby(['name'], as_index = False).sum()

Qui regroupe par nom et résume correctement les colonnes value1 et value2 mais finit par supprimer les colonnes otherstuff1 et otherstuff2.

Veuillez aider. Merci beaucoup les gars!

11
SwagZ 11 avril 2018 à 22:36

3 réponses

Meilleure réponse

Quelque chose comme? (En supposant que vous ayez les mêmes otherstuff1 et otherstuff2 sous le même nom)

df.groupby(['name','otherstuff1','otherstuff2'],as_index=False).sum()
Out[121]: 
   name  otherstuff1  otherstuff2  value1  value2
0  Jack         1.19         2.39       2       3
1  Luke         1.08         1.08       1       1
2  Mark         3.45         3.45       0       1
3
YOBEN_S 11 avril 2018 à 19:41

La clé de la réponse ci-dessus est en fait "as_index = False", sinon toutes les colonnes de la liste sont utilisées dans l'index.

P_summ = p.groupby (liste_attributs, as_index = False) .agg ({'AMT': sum})

0
Graven74 1 oct. 2019 à 13:42

Vous devez spécifier ce que les pandas doivent faire avec les autres colonnes. Dans votre cas, je pense que vous souhaitez conserver une ligne, quelle que soit sa position au sein du groupe.

Cela pourrait être fait avec agg sur un groupe. agg accepte un paramètre qui spécifie quelle opération doit être effectuée pour chaque colonne.

df.groupby(['name'], as_index=False).agg({'value1': 'sum', 'value2': 'sum', 'otherstuff1': 'first', 'otherstuff2': 'first'})
7
Guybrush 11 avril 2018 à 19:40