Comment additionner les valeurs regroupées par deux colonnes dans les pandas


21

J'ai un Pandas DataFrame comme celui-ci:

df = pd.DataFrame({
    'Date': ['2017-1-1', '2017-1-1', '2017-1-2', '2017-1-2', '2017-1-3'],
    'Groups': ['one', 'one', 'one', 'two', 'two'],
    'data': range(1, 6)})

    Date      Groups     data  
0  2017-1-1    one       1
1  2017-1-1    one       2
2  2017-1-2    one       3
3  2017-1-2    two       4
4  2017-1-3    two       5

Comment puis-je générer un nouveau DataFrame comme celui-ci:

    Date       one     two 
0  2017-1-1    3        0
1  2017-1-2    3        4
2  2017-1-3    0        5

Réponses:


16

pivot_table a été fait pour cela:

df.pivot_table(index='Date',columns='Groups',aggfunc=sum)

résulte en

         data
Groups    one  two
Date
2017-1-1  3.0  NaN
2017-1-2  3.0  4.0
2017-1-3  NaN  5.0

Personnellement, je trouve cette approche beaucoup plus facile à comprendre et certainement plus pythonique qu'une opération groupée alambiquée. Ensuite, si vous voulez que le format soit spécifié, vous pouvez simplement le ranger:

df.fillna(0,inplace=True)
df.columns = df.columns.droplevel()
df.columns.name = None
df.reset_index(inplace=True)

ce qui vous donne

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

1
Agréable! Ce devrait être la réponse acceptée.
tuomastik

@Josh D. C'est cool et simple! Je suis d'accord qu'il faut du cerveau pour comprendre comment fonctionne groupby. Merci!
Kevin

8

Pandas magie noire:

df = df.groupby(['Date', 'Groups']).sum().sum(
    level=['Date', 'Groups']).unstack('Groups').fillna(0).reset_index()

# Fix the column names
df.columns = ['Date', 'one', 'two']

Résultat df:

       Date  one  two
0  2017-1-1  3.0  0.0
1  2017-1-2  3.0  4.0
2  2017-1-3  0.0  5.0

Saint! La magie noire est tellement puissante! Merci beaucoup!
Kevin

Vous êtes les bienvenus! Voir la réponse mise à jour; J'ai simplifié l'expression et ajouté un correctif pour que les noms de colonne soient exactement comme demandé.
tuomastik

Je pense que votre version précédente a son avantage car elle peut être appliquée à d'autres ensembles de données plus compliqués. Je l'ai copié ici: df.groupby (['Date', 'Groups', 'data']) ['data']. Sum (). Sum (level = ['Date', 'Groups']). Unstack ( 'Groupes'). Fillna (0)
Kevin

@Kevin Si cette réponse ou une future réponse a résolu votre problème, veuillez accepter la réponse.
tuomastik
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.