如何用Pandas实现基于滞后变量的条件累加运行计数
Pandas实现条件累加运行计数
核心逻辑
- 逐行对比当前
value与滞后值lag_value的大小关系,匹配规则生成对应增量:当前值大于滞后值时增量为1,当前值小于滞后值时增量为-1,二者相等时增量为0 - 首行无有效滞后值,增量按0处理,对全列增量做累积求和,即可得到符合规则的运行计数,计算结果与预定义的
objective列完全匹配
代码实现
推荐写法(向量化运算,性能最优)
借助差值的符号直接生成增量,无需显式分支判断:
import numpy as np # 处理首行缺失滞后值的空值后,直接计算累积和 df['run_count'] = np.sign(df['value'] - df['lag_value']).fillna(0).cumsum()
显式规则匹配写法
如果需要清晰对照规则编写判断逻辑,可使用多条件分支生成增量:
import numpy as np df['increment'] = np.select( condlist=[df['value'] > df['lag_value'], df['value'] < df['lag_value']], choicelist=[1, -1], default=0 # 相等、首行无滞后值的场景,增量为0 ) df['run_count'] = df['increment'].cumsum()
结果校验
两种写法生成的run_count列与objective列取值完全一致,逐行匹配关系如下:
| date | value | lag_value | run_count | objective |
|---|---|---|---|---|
| 2021-01-01 | 1 | NaN | 0 | 0 |
| 2021-01-02 | 1 | 1 | 0 | 0 |
| 2021-01-03 | 2 | 1 | 1 | 1 |
| 2021-01-04 | 1 | 2 | 0 | 0 |
| 2021-01-05 | 2 | 1 | 1 | 1 |
| 2021-01-06 | 2 | 2 | 1 | 1 |
| 2021-01-07 | 1 | 2 | 0 | 0 |
| 2021-01-08 | 2 | 1 | 1 | 1 |
| 2021-01-09 | 3 | 2 | 2 | 2 |
这类向量化实现不需要逐行循环判断,处理十万行以上规模的数据集时,性能比遍历写法高几个数量级。
内容的提问来源于stack exchange,提问作者kdb
相关产品推荐
相关产品推荐

