You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 10:27:03