Pandas データフレームに累積合計列を追加して、次の操作を行います。
名前 | 日 | いいえ |
---|---|---|
ジャック | 月曜日 | 10 |
ジャック | 火曜日 | 20 |
ジャック | 火曜日 | 10 |
ジャック | 水曜日 | 50 |
ジル | 月曜日 | 40 |
ジル | 水曜日 | 110 |
次のように変わります:
Jack | Monday | 10 | 10
Jack | Tuesday | 30 | 40
Jack | Wednesday | 50 | 90
Jill | Monday | 40 | 40
Jill | Wednesday | 110 | 150
さまざまな組み合わせを試しましたdf.groupby
が、df.agg(lambda x: cumsum(x))
効果はありませんでした。
ベストアンサー1
これで完了です。2groupby()
回必要です:
df.groupby(['name', 'day']).sum() \
.groupby(level=0).cumsum().reset_index()
説明:
print(df)
name day no
0 Jack Monday 10
1 Jack Tuesday 20
2 Jack Tuesday 10
3 Jack Wednesday 50
4 Jill Monday 40
5 Jill Wednesday 110
# sum per name/day
print( df.groupby(['name', 'day']).sum() )
no
name day
Jack Monday 10
Tuesday 30
Wednesday 50
Jill Monday 40
Wednesday 110
# cumulative sum per name/day
print( df.groupby(['name', 'day']).sum() \
.groupby(level=0).cumsum() )
no
name day
Jack Monday 10
Tuesday 40
Wednesday 90
Jill Monday 40
Wednesday 150
最初の合計から得られたデータフレームは、'name'
と でインデックス付けされます'day'
。これを印刷するとわかります。
df.groupby(['name', 'day']).sum().index
'name'
累積合計を計算するときは、最初のインデックス (レベル 0) に対応するによって計算します。
最後に、reset_index
名前を繰り返すために を使用します。
df.groupby(['name', 'day']).sum().groupby(level=0).cumsum().reset_index()
name day no
0 Jack Monday 10
1 Jack Tuesday 40
2 Jack Wednesday 90
3 Jill Monday 40
4 Jill Wednesday 150