我现在花了几个小时试图在熊猫数据框上做一个“累计组合”。我已经查看了所有stackoverflow的答案,令人惊讶的是,它们都无法解决我的(非常基本的)问题:
我有一个数据框:
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
我正在尝试
所以期望的输出是:
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
答案 0 :(得分:7)
首先设置索引,然后设置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提供的相同答案
答案 1 :(得分:4)
您需要将输出分配到新列,然后按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
通过评论编辑:
首先groupby
列Name
和Date
以及汇总sum
,然后groupby
level
Name
并汇总{{ 1}}。
cumsum