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
Kevin
quelle

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
Josh D.
quelle
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
Tuomastik
quelle
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