如何在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
相关产品推荐
相关产品推荐

