使用Pandas Dataframe移除差值绝对值超200的数据及中间数据
问题:移除Pandas DataFrame中的异常区间数据
给定如下Pandas DataFrame:
timestamp value value_diff 0 1 100 NaN 1 2 110 10.0 2 3 112 2.0 3 4 130 18.0 4 5 8100 7970.0 5 6 8102 2.0 6 7 7998 -104.0 7 8 5000 -2998.0 8 9 140 -4860.0 9 10 180 40.0 10 11 200 20.0 11 12 205 5.0 12 13 230 25.0 13 14 8200 7970.0 14 15 3000 -5200.0 15 16 235 -2765.0 16 17 247 12.0 17 18 255 8.0 18 19 280 25.0 19 20 302 22.0 20 21 303 1.0 21 22 315 12.0 22 23 330 15.0 23 24 350 20.0 24 25 360 10.0
需求:移除所有value_diff绝对值大于200的数据,同时移除这些异常数据之间的所有条目,最终得到如下结果:
timestamp value value_diff 0 1 100 NaN 1 2 110 10.0 2 3 112 2.0 3 4 130 18.0 9 10 180 40.0 10 11 200 20.0 11 12 205 5.0 12 13 230 25.0 16 17 247 12.0 17 18 255 8.0 18 19 280 25.0 19 20 302 22.0 20 21 303 1.0 21 22 315 12.0 22 23 330 15.0 23 24 350 20.0 24 25 360 10.0
解决方案
通过标记异常区间、筛选有效区间的方式实现,具体步骤如下:
代码实现
import pandas as pd # 加载原始数据(如果已有DataFrame可跳过此步骤) df = pd.DataFrame({ 'timestamp': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25], 'value': [100,110,112,130,8100,8102,7998,5000,140,180,200,205,230,8200,3000,235,247,255,280,302,303,315,330,350,360], 'value_diff': [None,10.0,2.0,18.0,7970.0,2.0,-104.0,-2998.0,-4860.0,40.0,20.0,5.0,25.0,7970.0,-5200.0,-2765.0,12.0,8.0,25.0,22.0,1.0,12.0,15.0,20.0,10.0] }) # 1. 标记单条异常行(value_diff绝对值>200) is_abnormal = df['value_diff'].abs() > 200 # 2. 按异常行分组,标记整个异常区间 group = is_abnormal.cumsum() to_drop = df.groupby(group)['value_diff'].transform(lambda x: (x.abs()>200).any()) # 3. 筛选保留正常行 result_df = df[~to_drop] print(result_df)
代码解释
is_abnormal:布尔序列,直接标记value_diff绝对值超标的单条数据。group = is_abnormal.cumsum():对异常行累加分组,每遇到一个异常行就切换分组,让连续的异常区间和正常区间被拆分到不同组。to_drop:判断每个分组是否包含异常行,只要有异常就标记整个组为待删除。df[~to_drop]:筛选出非待删除的行,得到最终结果。
内容的提问来源于stack exchange,提问作者FranG91
相关产品推荐
相关产品推荐

