【问题标题】:Pandas replace by NaN if the difference with the previous row is above a treshold如果与前一行的差异高于阈值,则 Pandas 替换为 NaN
【发布时间】:2020-11-23 19:12:06
【问题描述】:

我有一个半小时的数据帧 df,我想从中删除异常值。

date  = ['2015-02-03 23:00:00','2015-02-03 23:30:00','2015-02-04 00:00:00','2015-02-04 00:30:00']
value_column = [33.24  , 500  , 34.39  , 34.49 ]

df = pd.DataFrame({'value column':value_column})
df.index = pd.to_datetime(df['index'],format='%Y-%m-%d %H:%M')
df.drop(['index'],axis=1,inplace=True)

print(df.head())
                   value column  
index                                     
2015-02-03 23:00:00  33.24   
2015-02-03 23:30:00  500   
2015-02-04 00:00:00  34.39   
2015-02-04 00:30:00  34.49   

我想根据从一小时到下一小时的值的差异来删除异常值。 如果从一小时到下一小时的绝对差值高于给定阈值,我想用 NaN 替换异常值。我怎样才能有效地做到这一点?

我知道我可以通过下面的行获得数据帧的差异,但是我不知道如何在差异高于给定阈值的已识别索引处用 nan 替换值。关于如何有效地做到这一点的任何想法? (例如假设阈值为 100)

df = df.diff()

我尝试了以下方法,它没有抛出任何错误但不起作用:

df["value column"]=df["value column"].mask(df["value column"].diff().abs() > 100, np.nan) 

预期结果:

                   value column  
index                                     
2015-02-03 23:00:00  33.24   
2015-02-03 23:30:00  NaN   
2015-02-04 00:00:00  34.39   
2015-02-04 00:30:00  34.49   

【问题讨论】:

    标签: python pandas outliers


    【解决方案1】:

    你需要从top和bot一起找到do diff,否则第3行也会被删除

    df["value column"].mask((df["value column"].diff(-1).abs()>100) & (df["value column"].diff().abs() > 100), np.nan) 
    Out[270]: 
    0    33.24
    1      NaN
    2    34.39
    3    34.49
    Name: value column, dtype: float64
    

    【讨论】:

      【解决方案2】:

      一种策略是将df.diff() 值作为新列附加到您的数据框,然后在每一行中使用df.apply() 方法返回原始行值或NaN,具体取决于新附加差异的值柱子。请记住,df.diff() 将为第一行返回 NaN,因此您需要在应用函数的“选择函数”中手动考虑这一点。

      df['diff'] = df.diff()
      df['value column'] = df.apply(lambda x: x[0] if x[-1]<=100 or np.isnan(x[-1]) else np.nan , axis=1)
      df
      

      结果:

                           value column
      index                            
      2015-02-03 23:00:00         33.24
      2015-02-03 23:30:00           NaN
      2015-02-04 00:00:00         34.39
      2015-02-04 00:30:00         34.49
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多