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

如何在DataFrame中检测特定值序列内的历史条件触发情况?

实现逻辑的最优方法(Pandas)

用Pandas的矢量化分组+位移操作就能高效实现,步骤清晰且性能拉满,适合处理大数据量:

  1. 标记连续值区块:先给condition列的连续相同值生成组ID,方便后续对连续T段做分组判断:
import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'condition': [False, False, False, True, True, True, False, False, False, True, True, True, True, True, False],
    'operator': [False, False, False, True, False, False, False, False, False, False, False, True, True, False, False]
})

# 生成连续值的组ID:相邻值不同时组ID+1
df['group'] = df['condition'].ne(df['condition'].shift()).cumsum()
  1. 预计算每个T组的operator存在性:对所有condition为True的组,判断组内是否存在operator为True的行,生成组ID到判断结果的映射:
# 提取T组,计算每组是否有operator=T,转成字典映射
group_has_operator = df[df['condition']].groupby('group')['operator'].any().to_dict()
  1. 定位切换点并赋值result:找到所有「前一行是T、当前行是F」的切换行,根据前一个T组的判断结果设置result,其余行默认False:
# 初始化result列为全False
df['result'] = False

# 定位切换点:当前行是F,且上一行是T
switch_points = (df['condition'] == False) & (df['condition'].shift() == True)

# 给切换点赋值:取前一个T组的判断结果
df.loc[switch_points, 'result'] = df.loc[switch_points, 'group'].apply(lambda x: group_has_operator.get(x-1, False))

# 清理临时的group列(可选)
df = df.drop('group', axis=1)

运行后得到的result列完全匹配示例要求。

为什么这是最优方案?

  • 时间复杂度O(n):所有操作都是Pandas内部优化的矢量化运算,比循环遍历快几个数量级,适配百万级行的大表。
  • 逻辑直观:每一步对应需求的一个环节,代码可读性强,后期好维护。
  • 无冗余操作:只用原生Pandas函数完成,不需要额外依赖复杂数据结构。

内容的提问来源于stack exchange,提问作者adsjr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:15:38