Pandas 按 cumsum 分组保留列

Pandas group by cumsum keep columns

我现在花了几个小时尝试在 pandas 数据帧上执行 "cumulative group by sum"。我查看了所有 Whosebug 的答案,令人惊讶的是 none 可以解决我的(非常初级的)问题:

我有一个数据框:

df1 Out[8]: Name Date Amount 0 Jack 2016-01-31 10 1 Jack 2016-02-29 5 2 Jack 2016-02-29 8 3 Jill 2016-01-31 10 4 Jill 2016-02-29 5

我正在尝试

  1. 按 ['Name'、'Date'] 和
  2. 分组
  3. 总和 'Amount'.
  4. 就是这样。

所以期望的输出是:

df1 Out[10]: Name Date Cumsum 0 Jack 2016-01-31 10 1 Jack 2016-02-29 23 2 Jill 2016-01-31 10 3 Jill 2016-02-29 15

编辑:我正在简化问题。根据目前的答案,我仍然无法获得正确的 "running" cumsum。仔细看,我要看的是累计和“10、23、10、15”。换句话说,我想在每个连续的日期看到一个人的总累计金额。注意:如果同一个人在一个日期有两个条目,我想将它们相加,然后将它们添加到 运行 cumsum 中,然后才打印总和。

您需要将输出分配给新列,然后通过 drop:

删除 Amount
df1['Cumsum'] = df1.groupby(by=['Name','Date'])['Amount'].cumsum()
df1 = df1.drop('Amount', axis=1)
print (df1)
   Name        Date  Cumsum
0  Jack  2016-01-31      10
1  Jack  2016-02-29       5
2  Jack  2016-02-29      13
3  Jill  2016-01-31      10
4  Jill  2016-02-29       5

另一个 assign 的解决方案:

df1 = df1.assign(Cumsum=df1.groupby(by=['Name','Date'])['Amount'].cumsum())
         .drop('Amount', axis=1)
print (df1)
   Name        Date  Cumsum
0  Jack  2016-01-31      10
1  Jack  2016-02-29       5
2  Jack  2016-02-29      13
3  Jill  2016-01-31      10
4  Jill  2016-02-29       5

通过评论编辑:

首先 groupbyNameDate 并聚合 sum,然后 groupby level Name 并聚合cumsum.

df = df1.groupby(by=['Name','Date'])['Amount'].sum()
        .groupby(level='Name').cumsum().reset_index(name='Cumsum')
print (df)
   Name        Date  Cumsum
0  Jack  2016-01-31      10
1  Jack  2016-02-29      23
2  Jill  2016-01-31      10
3  Jill  2016-02-29      15

先设置索引,再设置groupby。

df.set_index(['Name', 'Date']).groupby(level=[0, 1]).Amount.cumsum().reset_index()


OP 更改了他们的问题后,现在这是正确答案。

df1.groupby(
    ['Name','Date']
)Amount.sum().groupby(
    level='Name'
).cumsum()

这与 jezrael 提供的答案相同