Pandas按分组累加并保留指定列

14
我已经花费了几个小时尝试在pandas数据帧上执行“累积分组求和”。我查看了所有stackoverflow答案,但令人惊讶的是,它们都不能解决我的(非常基础的)问题:
我有一个数据帧:
df1
我正在尝试
1.按 ['Name','Date'] 进行分组,并且 2.对 'Amount' 进行累加。 3.就是这样。
所以期望输出是:
df1
2个回答

15
你需要将输出分配到新列中,然后通过 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

评论编辑:

首先按照 NameDate 分组列并聚合 sum,然后按照 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

感谢您的回复,但是第二组应该将Jack的多个2016-02-29金额合并在一起。因此,Cumsum只能有四行,分别为“10、23、10、15”。尽管如此,我会尝试使用您提供的内容进行工作,谢谢。 - gmarais

11

先设置索引,然后按组进行分组。

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

enter image description here


在该帖子作者修改问题后,这现在是正确的答案。

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

这是由jezrael提供的相同答案。


谢谢您的回复。根据我的编辑,您的解决方案没有给出所需的输出,但我相信您提供了很好的指导。谢谢。 - gmarais
给我点踩的人,请重新考虑,因为问题在答案给出后被 OP 更改了。我不想显得抄袭 jezrael 的答案,所以只是参考了一下。 - piRSquared
嗨,piRSquared,我给你的投票打了个反对,因为即使在编辑之前,原始期望输出也没有通过你的代码实现 - 所以至少在我看来不应该点赞。然而,回过头来看,你提供了 set_index,解决了我的次要问题,所以我会点赞。再次感谢。 - gmarais
感谢您的迅速回复和帮助。 - gmarais
只是一条注释:这解决了我使用cumsum()时未包括groupby列的问题。所以谢谢! - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接