问题描述
我正在尝试从pandas DataFrame中的列中删除异常值。
这是我的变量最初的样子(带有明显的异常值):
然后,我决定删除所有变化为+/- 3的内容(因为我知道应该不会有太大的变化):
这有效,并且让我用NaN代替了尖峰:
但是,每当我尝试用以前的观察结果替换现在缺少的值时,我都会以某种方式返回一些峰值!
有人会知道我在做什么错吗?
这是完整的代码(在不定期的while循环中):
df = pd.DataFrame({'soc': [38.0,38.0,127.0,66.48,55.8,38.0]})
while (abs(df['soc'].diff()) > 3).any():
df['soc'] = np.where(abs(df['soc'].diff()) > 3,np.nan,df['soc'])
df['soc'].fillna(method='ffill',inplace=True)
解决方法
我相信您不会删除偏差大于3的值,因为在第二张图中,我仍然可以显示不应该出现的点。也许您也分配了错误的列。这是您打算执行的一般示例:
df = pd.DataFrame({'A':[100,110,105,104,103,102,101]})
df['A'] = np.where(abs(df['A'].diff()) > 3,np.nan,df['A'])
df['A'] = df['A'].fillna(method='ffill')
在此示例中,应该删除110和105,因为它们之间的偏差大于3,并且将它们替换为100。输出:
A
0 100.0
1 100.0
2 100.0
3 104.0
4 103.0
5 102.0
6 101.0