Python 从满足条件的最后一行开始的累计总和
我有以下形式的数据帧:Python 从满足条件的最后一行开始的累计总和,python,pandas,Python,Pandas,我有以下形式的数据帧: |----------|----|------| |date |type|inflow| |----------|----|------| |2017-01-01|I | 3500| |2017-02-01|A | 23| |2017-07-01|A | 44| |2017-09-01|A | 55| |2017-12-01|A | 12| |2018-01-01|I | 3800| |2018-03-01|A
|----------|----|------|
|date |type|inflow|
|----------|----|------|
|2017-01-01|I | 3500|
|2017-02-01|A | 23|
|2017-07-01|A | 44|
|2017-09-01|A | 55|
|2017-12-01|A | 12|
|2018-01-01|I | 3800|
|2018-03-01|A | 87|
|2018-05-01|A | 34|
|2018-07-01|A | 23|
|----------|----|------|
I是初始流入量,以及额外流入量。它们不一定按年份分组,日期可以是任意的。我希望在每一行中都有一个累积和,从我上次遇到一个I开始。因此,当我遇到另一个I时,累积和应该重置。如果有帮助,两个I之间的As的最大数量可以是5
我尝试使用apply和rollappy,但无法找出如何在不一致的滚动窗口上应用它们。
如何使用熊猫来实现这一点?让我们试试:
详细信息
df['type'].eq('I').cumsum()
用于标记流入组,以执行分组累计和
请参见下面的可视化:
type type == "I" (type == "I").cumsum()
I True 1
A False 1
A False 1
A False 1
A False 1
I True 2
A False 2
A False 2
A False 2
您会注意到,1和2列将唯一地标识要执行累加运算的组。这真是太神奇了,非常感谢。即使使用for循环,我也在努力计算这个。您能解释一下为什么使用了两次cumsum()函数吗?我明白第二个的目的,但不是第一个。我可以看出,没有第一个是不行的,但是我不能理解它在做什么,这是非常有帮助的。我现在可以理解,它是
eq('I')
返回的布尔值的总和()。再次感谢。请注意其他人的参考,这种方法也非常快。在我的core i5笔记本电脑上,我的实际数据帧大约有150000行,这大约需要1.2秒(还有一些其他步骤,我在这里没有显示)来分组另外两列。@gouravkr听起来不错,感谢您测试和验证代码!
type type == "I" (type == "I").cumsum()
I True 1
A False 1
A False 1
A False 1
A False 1
I True 2
A False 2
A False 2
A False 2