Summieren von Werten, die in Pandas nach zwei Spalten gruppiert sind


21

Ich habe einen Pandas DataFrame wie diesen:

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

Wie kann ich einen neuen DataFrame wie folgt generieren:

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

Antworten:


16

pivot_table wurde dafür gemacht:

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

Ergebnisse in

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

Persönlich finde ich diesen Ansatz viel verständlicher und sicher pythonischer als eine verschlungene Gruppenoperation. Wenn Sie das angegebene Format wünschen, können Sie es einfach aufräumen:

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

was gibt dir

       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
Nett! Dies sollte die akzeptierte Antwort sein.
— Tuomastik

@Josh D. Das ist cool und unkompliziert! Ich bin damit einverstanden, dass es einige Gehirnleistung erfordert, um herauszufinden, wie Groupby funktioniert. Vielen Dank!
— Kevin

8

Pandas schwarze Magie:

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']

Ergebnis 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

Heilig! Die schwarze Magie ist so mächtig! Vielen Dank!
— Kevin

Bitte! Siehe die aktualisierte Antwort; Ich habe den Ausdruck vereinfacht und ein Update hinzugefügt, damit die Spaltennamen genau den Anforderungen entsprechen.
— Tuomastik

Ich denke, dass Ihre vorherige Version ihren Vorteil hat, da sie auf andere kompliziertere Datensätze angewendet werden kann. Ich habe es hier kopiert: df.groupby (['Date', 'Groups', 'data']) ['data']. Sum (). Sum (level = ['Date', 'Groups']). Unstack ( 'Gruppen'). Fillna (0)
— Kevin

@ Kevin Wenn diese oder eine zukünftige Antwort Ihr Problem gelöst hat, akzeptieren Sie bitte die Antwort.
— Tuomastik
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.