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.