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