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
Kevin
la source

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
Josh D.
la source
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
tuomastik
la source
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