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

如何在Pandas中实现Flip Flop机制?寻求矢量化实现方法

Pandas中高效实现Flip Flop触发器的矢量化方案

核心实现代码

import pandas as pd

data1 = [1,1,0,0,0,1,0,0,0,0,1]
data2 = [0,0,1,0,0,0,0,0,1,1,0]
df = pd.DataFrame({"d1": data1, "d2": data2})

# 1. 用d1触发事件生成周期分组
df['cycle'] = (df['d1'] == 1).cumsum()

# 2. 每个周期内累积标记是否已遇到d2=1的停止信号
df['first_stop'] = df.groupby('cycle')['d2'].cummax()

# 3. 生成目标列data3:未触发停止时为1,触发后为0
df['data3'] = (df['first_stop'] == 0).astype(int)

# 验证结果
print(df['data3'].tolist())  # 输出: [1,1,0,0,0,1,1,1,0,0,1]

原理说明

  • 周期分组:(df['d1'] == 1).cumsum() 会为每个由d1=1启动的连续区间分配唯一组号,比如第一次d1=1开始的所有行属于周期1,下一次d1=1启动的行属于周期2,以此类推,实现对触发器循环周期的划分。
  • 累积停止标记:groupby('cycle')['d2'].cummax() 在每个周期内从左到右累积最大值——一旦遇到d2=1,后续所有行的标记会保持为1,代表该周期已进入"停止"状态。
  • 生成目标状态:通过判断累积停止标记是否为0,直接得到每个位置的状态:未遇到停止信号时标记为0,对应data3=1;已遇到停止信号时标记为1,对应data3=0,完全匹配需求中的Flip Flop逻辑。

性能优势

相比iterrows()的逐行循环逻辑,这个矢量化方案完全依赖Pandas内置的C层面优化函数,避免了Python级别的循环开销。在处理十万级以上数据时,性能会有数量级的提升,更适合大规模数据集的处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:50:37