Python Pandas - 对满足条件的连续分组行进行计数,并在 false 时重置计数器
Python Pandas - Count consecutive grouped rows that satisfy condition and reset counter when false
我需要向现有数据框添加一个标记为“计数器”的新列,该列将按以下示例所示进行计算:
symbol
percentage
??? counter ???
A
11
-1
A
2
0
A
5
1
B
2
0
B
1
1
B
3
2
A
2
2
A
9
-1
A
4
0
B
2
3
B
8
-1
B
7
-1
所以数据是按“符号”分组的,计算“计数器”的逻辑是这样的:
- 如果“百分比”大于5,则“计数器”等于-1
- 如果“百分比”小于 5,那么我们从 0 开始计数,如果同一交易品种的下一行再次小于 5,我们增加计数
- 如果下一行“百分比”再次大于 5,我们将中断计数并将“计数器”列再次设置为 -1
我试过类似的方法,但效果不佳,因为重置不起作用:
df['counter'] = np.where(df['percentage'] > 5, -1, df.groupby('symbol').cumcount())
IIUC,你可以使用掩码和自定义 groupby
:
m = df['percentage'].gt(5)
group = m.groupby(df['symbol']).apply(lambda s: s.ne(s.shift()).cumsum())
df['count'] = (df
.groupby(['symbol', group])
.cumcount()
.mask(m, -1)
)
输出:
symbol percentage counter
0 A 11 -1
1 A 2 0
2 A 5 1
3 B 2 0
4 B 1 1
5 B 3 2
6 A 2 2
7 A 9 -1
8 A 4 0
9 B 2 3
10 B 8 -1
11 B 7 -1
我需要向现有数据框添加一个标记为“计数器”的新列,该列将按以下示例所示进行计算:
symbol | percentage | ??? counter ??? |
---|---|---|
A | 11 | -1 |
A | 2 | 0 |
A | 5 | 1 |
B | 2 | 0 |
B | 1 | 1 |
B | 3 | 2 |
A | 2 | 2 |
A | 9 | -1 |
A | 4 | 0 |
B | 2 | 3 |
B | 8 | -1 |
B | 7 | -1 |
所以数据是按“符号”分组的,计算“计数器”的逻辑是这样的:
- 如果“百分比”大于5,则“计数器”等于-1
- 如果“百分比”小于 5,那么我们从 0 开始计数,如果同一交易品种的下一行再次小于 5,我们增加计数
- 如果下一行“百分比”再次大于 5,我们将中断计数并将“计数器”列再次设置为 -1
我试过类似的方法,但效果不佳,因为重置不起作用:
df['counter'] = np.where(df['percentage'] > 5, -1, df.groupby('symbol').cumcount())
IIUC,你可以使用掩码和自定义 groupby
:
m = df['percentage'].gt(5)
group = m.groupby(df['symbol']).apply(lambda s: s.ne(s.shift()).cumsum())
df['count'] = (df
.groupby(['symbol', group])
.cumcount()
.mask(m, -1)
)
输出:
symbol percentage counter
0 A 11 -1
1 A 2 0
2 A 5 1
3 B 2 0
4 B 1 1
5 B 3 2
6 A 2 2
7 A 9 -1
8 A 4 0
9 B 2 3
10 B 8 -1
11 B 7 -1