Pandas无需逐行迭代计算触发列三类滚动衍生指标的实现方法
Pandas 向量化实现方案
完全不需要逐行迭代,只用Pandas内置的向量化函数即可完成三个指标的计算,实现代码和逻辑如下:
前置依赖
仅需要安装pandas和numpy库即可。
完整实现代码
import pandas as pd import numpy as np # ---------------------- 构造示例测试数据 ---------------------- df = pd.DataFrame({ 'id': range(1, 11), 'Date': pd.date_range(start='2024-01-01', periods=10), 'Trigger': [1, 1, np.nan, 1, np.nan, np.nan, 1, 1, 1, np.nan] }) # ---------------------- 1. 计算DST(距上次触发天数) ---------------------- is_trigger = df['Trigger'].notna() # 向前填充最近一次触发的行索引,首次触发前自动保留NaN last_trigger_idx = df.index.where(is_trigger).ffill() df['DST'] = df.index - last_trigger_idx # ---------------------- 2. 计算DC(连续触发天数) ---------------------- # 遇到非触发行生成新的分组标签,同一分组内为连续触发的行 trigger_group = (~is_trigger).cumsum() # 分组内累计计数+1即为连续触发天数,非触发行设为0 df['DC'] = df.groupby(trigger_group).cumcount() + 1 df.loc[~is_trigger, 'DC'] = 0 # ---------------------- 3. 计算3D(最近3行触发次数) ---------------------- # rolling窗口大小为3,min_periods=1适配前几行不足3行的场景 df['3D'] = df['Trigger'].rolling(window=3, min_periods=1).sum() # 输出结果验证 print(df)
逻辑说明
- DST计算:先提取所有触发行的行索引,用向前填充把每个位置对应的最近触发行索引带下来,直接做索引差得到间隔天数
- DC计算:用非触发行做分组边界,同一组内都是连续的触发行,分组内累计计数即可得到连续触发天数
- 3D计算:直接用滑动窗口求和,
min_periods=1参数保证前几行不足3行时也会按实际存在的行数统计
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

