Pandas可变窗口计算:实现连续负数分段累计计数
Pandas 连续负数分段计数解决方案
核心思路
通过分组标识区分每一段连续的负数区间,再在分组内做累计计数,遇到正数自动重置计数。
完整可运行代码
import pandas as pd # 构造测试数据 numbers = pd.DataFrame({'E': [-0.66, -0.32, 1.4, -0.45, -0.32, -0.76, 1.1, 2.9]}) # 方法1:分步实现,方便调试查看中间结果 # 1. 标记是否为负数 numbers['is_negative'] = numbers['E'] < 0 # 2. 生成分组ID:每遇到一次正数,分组ID+1 numbers['group_id'] = (~numbers['is_negative']).cumsum() # 3. 分组内累计计数 numbers['sum_negative'] = numbers.groupby('group_id')['is_negative'].cumsum().astype(int) # 可选:不需要中间列的极简实现 # numbers['sum_negative'] = numbers['E'].lt(0).groupby(numbers['E'].ge(0).cumsum()).cumsum().astype(int) print(numbers)
输出结果
| index | E | is_negative | group_id | sum_negative |
|---|---|---|---|---|
| 0 | -0.66 | True | 0 | 1 |
| 1 | -0.32 | True | 0 | 2 |
| 2 | 1.40 | False | 1 | 0 |
| 3 | -0.45 | True | 1 | 1 |
| 4 | -0.32 | True | 1 | 2 |
| 5 | -0.76 | True | 1 | 3 |
| 6 | 1.10 | False | 2 | 0 |
| 7 | 2.90 | False | 3 | 0 |
实现逻辑说明
numbers['E'].lt(0)生成布尔序列,负数对应True(等价于数值1),正数对应False(等价于数值0)numbers['E'].ge(0).cumsum()每遇到正数就累加1,天然将每一段连续负数划分到同一个分组- 按分组ID分组后对布尔列执行
cumsum,自动生成分段递增的连续计数,正数位置的计数自然为0
内容的提问来源于stack exchange,提问作者user16216512
相关产品推荐
相关产品推荐

