带有填充的熊猫fillna会增加噪音

问题描述

我正在尝试从pandas DataFrame中的列中删除异常值。

这是我的变量最初的样子(带有明显的异常值):

enter image description here

然后,我决定删除所有变化为+/- 3的内容(因为我知道应该不会有太大的变化):

这有效,并且让我用NaN代替了尖峰:

enter image description here

但是,每当我尝试用以前的观察结果替换现在缺少的值时,我都会以某种方式返回一些峰值!

enter image description here

有人会知道我在做什么错吗?

这是完整的代码(在不定期的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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...