熊猫组由cumsum保持列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了熊猫组由cumsum保持列相关的知识,希望对你有一定的参考价值。
我花了几个小时试图在熊猫数据框架上做一个“累计组合”。我已经查看了所有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
我在尝试着
- 按['姓名','日期']和
- cumsum'Anount'。
- 这就对了。
所以期望的输出是:
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
编辑:我正在简化这个问题。根据目前的答案,我仍然无法获得正确的“正在运行”的cumsum。仔细看,我希望看到累计金额“10,23,10,15”。换句话说,我希望在每个连续日期看到一个人的总累计金额。注意:如果同一个人在一个日期有两个条目,我想对它们求和,然后将它们添加到正在运行的cumsum中,然后才打印总和。
您需要将输出分配给新列,然后通过Amount
删除drop
列:
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
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提供的相同答案
以上是关于熊猫组由cumsum保持列的主要内容,如果未能解决你的问题,请参考以下文章
如何通过在两行之间划分特定列中的值并保持其他列不变来在熊猫数据框中创建新行?
pandas使用groupby函数和cumsum函数计算每个分组内的数值累加值并生成新的dataframe数据列( cumulative sum of each group in dataframe