创建一列连续的负天数

问题描述

我有巨大的(超过300万行)熊猫数据框,其中包含以下数据:

companyId     dateBalance       amount 
    1          2020-04-17         100     
    1          2020-04-18          40       
    1          2020-04-19          20       
    1          2020-04-20         -40       
    1          2020-04-21          30       
    2          2020-04-18           5       
    2          2020-04-19           1       
    2          2020-04-20          -6       
    2          2020-04-21          -60      
    2          2020-04-22          200      

我想创建一个新列来计算公司负余额连续的天数,因此在这种情况下,我们有以下内容

companyId     dateBalance       amount  negCount
    1          2020-04-17         100       0
    1          2020-04-18          40       0
    1          2020-04-19          20       0
    1          2020-04-20         -40       1
    1          2020-04-21          30       0
    2          2020-04-18           5       0
    2          2020-04-19           1       0
    2          2020-04-20          -6       1
    2          2020-04-21          -60      2 
    2          2020-04-22          200      0

是否有一种快速方法(即某种不需要在每一行上进行迭代的方法)?请注意,该索引还必须“重置”每个符号更改以及每个不同的公司。

解决方法

对条件取反使用groupby().cumsum()来识别块,然后再次对块进行分组:

blocks = df['amount'].ge(0).groupby(df['companyId']).cumsum()
df['negCount'] = df.groupby([df['companyId'],blocks]).cumcount()

输出:

   companyId dateBalance  amount  negCount
0          1  2020-04-17     100         0
1          1  2020-04-18      40         0
2          1  2020-04-19      20         0
3          1  2020-04-20     -40         1
4          1  2020-04-21      30         0
5          2  2020-04-18       5         0
6          2  2020-04-19       1         0
7          2  2020-04-20      -6         1
8          2  2020-04-21     -60         2
9          2  2020-04-22     200         0