Ich möchte meinem Pandas-Datenrahmen eine kumulative Summenspalte hinzufügen, damit:
name | day | no
-----|-----------|----
Jack | Monday | 10
Jack | Tuesday | 20
Jack | Tuesday | 10
Jack | Wednesday | 50
Jill | Monday | 40
Jill | Wednesday | 110
wird:
Jack | Monday | 10 | 10
Jack | Tuesday | 30 | 40
Jack | Wednesday | 50 | 90
Jill | Monday | 40 | 40
Jill | Wednesday | 110 | 150
Ich habe verschiedene Kombinationen ausprobiert df.groupby
und df.agg(lambda x: cumsum(x))
ohne Erfolg.
Antworten:
Dies sollte es tun,
groupby()
zweimal brauchen :Erläuterung:
Der aus der ersten Summe resultierende Datenrahmen wird nach
'name'
und nach indiziert'day'
. Sie können es durch Drucken sehenWenn Sie die kumulative Summe berechnen, möchten Sie dies
'name'
entsprechend dem ersten Index (Ebene 0) tun .Verwenden Sie
reset_index
zum Schluss, um die Namen wiederholen zu lassen.quelle
name
undday
alsmultiIndex
, was sinnvoller ist (reset_index()
um denint
Index zu erhalten , falls gewünscht). 2) ist daslevel=[0]
Mittel,groupby
um durch die 1. Ebene derMultiIndex
Spalte zu arbeitenname
.groupby()
Standard ist das Sortieren der Schlüssel. Wenn Sie also eine Jack-Thursday-Zeile am unteren Rand des Eingabedatensatzes hinzufügen, erhalten Sie unerwartete Ergebnisse. Und dagroupby()
ich mitdf.groupby(['name', 'day'], sort=False).sum().groupby(by='name').cumsum().reset_index()
Levelnamen arbeiten kann finde ich weniger kryptisch.Dies funktioniert in Pandas 0.16.2
quelle
name
undday
vor der Berechnung der kumulierten Summe nach aggregiert wirdname
(Hinweis: Das Ergebnis enthält 2 Zeilen für Jack + Tuesday). Dies macht es einfacher als die Antwort von CT Zhu .Änderung der Antwort von @ Dmitry. Dies ist einfacher und funktioniert in Pandas 0.19.0:
quelle
du solltest benutzen
http://pandas.pydata.org/pandas-docs/version/0.19.2/generated/pandas.DataFrame.cumsum.html
Ein anderer Weg, es zu tun
quelle
90
als Summe aller Jack-Werte +40
den Wert für Jill-Monday).Anstelle von
df.groupby(by=['name','day']).sum().groupby(level=[0]).cumsum()
(siehe oben) können Sie auch einedf.set_index(['name', 'day']).groupby(level=0, as_index=False).cumsum()
df.groupby(by=['name','day']).sum()
verschiebt eigentlich nur beide Spalten in einen MultiIndexas_index=False
bedeutet, dass Sie reset_index danach nicht mehr aufrufen müssenquelle
groupby().sum()
nicht nur beide Spalten in MultiIndex verschoben werden, sondern auch die beiden Werte für Jack + Tuesday zusammengefasst werden. Undas_index=False
scheint in diesem Fall keine Wirkung zu haben, da der Index bereits vor dem gesetzt wurdegroupby
. Und dagroupby().cumsum()
der Name / Tag aus den Spalten des Datenrahmens entfernt wird, müssen Sie entweder die resultierende numerische Spalte zum ursprünglichen Datenrahmen hinzufügen (wie von vjayky und Dmitry vorgeschlagen) oder den Namen / Tag in den Index verschieben und anschließend den Index zurücksetzen.