创建一个计算连续负天数的列
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
我有一个巨大的(超过 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