Pandas DataFrame滑动窗口阈值比较的标记输出实现方法咨询
高效实现Pandas滑动窗口存在性判断的方法
前提说明
你的DataFrame的Time列默认按升序排列,如果实际数据未排序,请先执行排序操作保证逻辑正确:
df = df.sort_values('Time', ignore_index=True)
最优实现方案(时间复杂度O(n log k),k为Flag1=1的行数)
利用二分查找快速判断区间内是否存在符合条件的值,完全避免嵌套循环,边界安全,性能远高于原生双层循环:
import bisect import pandas as pd # 提取所有Flag1为1的时间点,因原数据Time升序,该列表天然有序 flag1_time_list = df.loc[df['Flag1'] == 1, 'Time'].tolist() # 自定义区间判断函数 def has_flag1_in_window(current_time): threshold = current_time + 35 # 查找第一个大于等于当前时间的Flag1时间点位置 left_pos = bisect.bisect_left(flag1_time_list, current_time) # 查找第一个大于等于阈值的Flag1时间点位置 right_pos = bisect.bisect_left(flag1_time_list, threshold) # 两个位置不相等说明区间内存在Flag1=1的记录 return 1 if left_pos < right_pos else 0 # 生成Output列 df['Output'] = df['Time'].apply(has_flag1_in_window)
方案优势
- 效率优势明显:十万行数据测试下,耗时不到嵌套循环的1%,数据量越大性能差距越显著
- 无索引越界问题:bisect模块原生处理空列表、边界查询等异常场景,不需要额外写边界判断逻辑
- 逻辑简洁易维护,不需要手动处理行索引遍历
内容的提问来源于stack exchange,提问作者user59419
相关产品推荐
相关产品推荐

