You need to enable JavaScript to run this app. pandas如何高效计算当前行距上次满足布尔条件行的间隔行数
优惠活动
大模型
产品
解决方案
定价
更多

pandas如何高效计算当前行距上次满足布尔条件行的间隔行数

最高效实现方案

整个逻辑全部用pandas向量化操作完成,无逐行循环,性能最优,适配任意规模的数据集。

完整实现代码

import pandas as pd
import numpy as np

# 初始化测试数据
mdf = pd.DataFrame(np.random.randint(0, 100, size=(100, 1)), columns=list('A'))
# 生成条件列CM
mdf['CM'] = mdf['A'] > mdf['A'].shift(5)

# 生成连续行号,避免原索引不连续导致间隔计算错误
row_pos = np.arange(len(mdf))
# 标记CM为True时对应的行位置
last_true_pos = row_pos.where(mdf['CM'].to_numpy())
# 向前填充,为每一行匹配上方最近一次CM为True的行位置
last_true_pos = pd.Series(last_true_pos).ffill()
# 计算间隔行数
mdf['SINCE'] = row_pos - last_true_pos

# 可选:将列转为可空整数类型,避免空值显示为浮点数NaN
mdf['SINCE'] = mdf['SINCE'].astype('Int64')

逻辑说明

  • 最开头的几行,因为还没有遇到过第一次CM为True的记录,匹配到的行位置为空值,最终计算出的SINCE为NA,和需求要求的None效果完全一致。
  • 当CM为True的行,匹配到的最近位置就是当前行本身,所以SINCE为0,符合规则。
  • 后续CM为False的行,会自动匹配到上一次CM为True的行位置,差值就是要求的间隔行数。

结果验证

用提供的测试样例运行上述代码,输出的SINCE列完全匹配参考效果:

IdxACMSINCE
023False
155False
248False
317False
424True0
530False1
699True0
711False1
847True0
925False1
1078False2
1140True0
1299True0
137False1
146False2
1564True0
1662False1
1739True0
1841True0
1928False1

内容的提问来源于stack exchange,提问作者S. A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 13:54:03