Pandas 如果与上一行的差异高于阈值,则替换为 NaN
Pandas replace by NaN if the difference with the previous row is above a treshold
我有一个半小时数据帧 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
一种策略是将 df.diff()
值作为新列附加到数据框,然后在每一行中使用 df.apply()
方法 return 原始行值或NaN 取决于新附加的 diff 列的值。请记住,第一行的 df.diff()
将为 return 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
我有一个半小时数据帧 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
一种策略是将 df.diff()
值作为新列附加到数据框,然后在每一行中使用 df.apply()
方法 return 原始行值或NaN 取决于新附加的 diff 列的值。请记住,第一行的 df.diff()
将为 return 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