创建事件计数列表:阈值触发标记后无法生成目标数据框问题
问题分析与解决方案
你的代码目前只返回0或1,核心问题有这几个:
frame_of_reference['TTC_radar'].any()是检查整个列是否存在符合条件的值,不是针对当前窗口或每行做判断- 每次循环都重置
events_ttc为单个元素的列表,没有累积标记结果,也没和原数据关联 - 没有逻辑来提取符合条件的行并生成目标数据框
下面是针对需求的完整实现方案:
方案1:逐行标记并提取符合阈值的行
如果你的需求是逐行检查TTC_radar是否在(0,1.5]区间,标记这些行并统计数量,最后输出包含这些行的DataFrame,可以这么做:
import pandas as pd # 确保数据是数值型(你的原有代码没问题) frame_of_reference = frame_of_reference.apply(pd.to_numeric, errors='coerce') # 1. 添加标记列:标记每行是否符合阈值条件 frame_of_reference['is_alert'] = frame_of_reference['TTC_radar'].apply(lambda x: 1 if 0.0 < x <= 1.5 else 0) # 2. 统计符合条件的行数 alert_count = frame_of_reference['is_alert'].sum() print(f"符合阈值的事件总数:{alert_count}") # 3. 提取所有标记为1的行,生成目标数据框 alert_frame = frame_of_reference[frame_of_reference['is_alert'] == 1].copy() # 查看结果 print(alert_frame)
方案2:按滑动窗口(window_size=10)标记并提取
如果你的需求是按窗口大小10来检查每个窗口内是否存在符合阈值的数据,并标记窗口内的行,或者提取包含符合条件值的窗口数据,可以用滑动窗口的方式:
import pandas as pd frame_of_reference = frame_of_reference.apply(pd.to_numeric, errors='coerce') window_size = 10 # 1. 用滑动窗口检查每个窗口内是否有符合条件的值,生成窗口标记 frame_of_reference['window_alert'] = frame_of_reference['TTC_radar'].rolling(window=window_size, min_periods=1).apply( lambda window: 1 if any(0.0 < x <= 1.5 for x in window) else 0, raw=True ) # 2. 统计有多少个窗口触发警报 window_alert_count = frame_of_reference['window_alert'].value_counts().get(1, 0) print(f"触发警报的窗口数量:{window_alert_count}") # 3. 提取所有包含警报窗口的行 alert_window_frame = frame_of_reference[frame_of_reference['window_alert'] == 1].copy() print(alert_window_frame)
关键说明
- 如果你需要的是每行级别的标记,方案1更直接,能精准定位到每个触发阈值的行
- 如果是窗口级别的检测,方案2用
rolling实现滑动窗口,确保每个窗口内的情况都被捕捉到 - 两种方案都保留了原数据的所有信息,同时添加了标记列,方便后续分析
内容的提问来源于stack exchange,提问作者Alieu F. Thomas
相关产品推荐
相关产品推荐

