python - 如果与前一行的差异高于阈值,则 Pandas 替换为 NaN

标签 python pandas outliers

我有一个半小时的数据帧 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   

最佳答案

您需要从 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

关于python - 如果与前一行的差异高于阈值,则 Pandas 替换为 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63234180/

相关文章:

python - Pandas Statsmodels 使用 DF 预测器进行回归预测?

python - 如何为 Kmeans 散点图并打印异常值

r - R中时间序列数据的异常值检测

r - 在 R 箱线图上标记异常值

python - 有没有办法在 python 中绘制 z 值

python - 在深度学习keras的损失函数中添加中间层

python - 用 python 显示鼠标位置

python - groupby : Take the most frequent value but if its a blank, 的聚合函数采用第二个最频繁的值

Python:如何为单个迹线添加辅助 x 轴?

python - 使用 isinstance 测试 Unicode 字符串