Pandas groupby 累積合計 質問する

Pandas groupby 累積合計 質問する

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

おすすめ記事