如何使用Pandas填充异常检测数据中的指定长度间隙?
填充Pandas中指定长度的异常检测间隙
问题场景
我有一个仅包含0和1的Pandas DataFrame,0代表未检测到异常,1代表检测到异常:
import pandas as pd input_data = pd.DataFrame(data={'my_event': [0., 0., 1., 1., 0., 1., 0., 0., 0., 1., 1.]}, index=pd.date_range(start='2023-01-01 00:00:00', end='2023-01-01 00:00:10', freq='s'))
需求是仅填充2秒及更短的异常间隙(间隙指异常检测时段之间的短时间未检测到异常的时段),示例预期输出为my_event列值为[0., 0., 1., 1., 1., 1., 0., 0., 0., 1., 1.]的DataFrame,核心是能自定义指定填充的间隙长度。
简便解决方案
方法:结合前向/后向填充与时间步限制
通过将0替换为NaN,利用Pandas的ffill和bfill方法的limit参数控制填充的间隙长度,步骤直观易懂:
- 复制原数据并将0替换为NaN,保留1作为异常标记:
df = input_data.copy() df['my_event'] = df['my_event'].replace(0, pd.NA)
- 双向填充短间隙,最后还原长间隙的NaN为0:
# 定义允许填充的最大间隙时长(对应索引频率的步数,此处为秒级,所以2秒=2步) max_gap_steps = 2 # 前向填充:从异常点往后填充,最多覆盖max_gap_steps个时间步 df_filled = df.ffill(limit=max_gap_steps) # 后向填充:从异常点往前填充,覆盖剩余符合条件的间隙 df_filled = df_filled.bfill(limit=max_gap_steps) # 将未被填充的NaN(即超过max_gap_steps的长间隙)还原为0 df_filled['my_event'] = df_filled['my_event'].fillna(0)
运行后得到的df_filled即为预期结果:
my_event 2023-01-01 00:00:00 0.0 2023-01-01 00:00:01 0.0 2023-01-01 00:00:02 1.0 2023-01-01 00:00:03 1.0 2023-01-01 00:00:04 1.0 2023-01-01 00:00:05 1.0 2023-01-01 00:00:06 0.0 2023-01-01 00:00:07 0.0 2023-01-01 00:00:08 0.0 2023-01-01 00:00:09 1.0 2023-01-01 00:00:10 1.0
原理说明
ffill(limit=max_gap_steps):基于索引的时间频率,limit参数控制填充的最大时间步数,只会填充异常点之后≤指定时长的间隙。bfill(limit=max_gap_steps):反向填充异常点之前的短间隙,确保双向覆盖所有符合条件的间隙。- 最后还原NaN为0:保留那些超过指定时长的正常间隙(比如示例中第6-8秒的连续3个0,不会被填充)。
适配不同时间频率
如果你的DataFrame索引是其他频率(如分钟、小时),只需将max_gap_steps设置为对应时长的步数即可。例如,分钟级索引下要填充5分钟的间隙,就设置max_gap_steps=5。
内容的提问来源于stack exchange,提问作者Axel
相关产品推荐
相关产品推荐

