创建一个计算连续负天数的列

Create a column counting number of consecutive negative days

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

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