熊猫:用nan替换所有列中的异常值

时间:2017-10-05 00:31:21

标签: pandas replace outliers

我有一个包含3列的数据框,对于前

c1,c2,c3 
10000,1,2 
1,3,4 
2,5,6 
3,1,122 
4,3,4 
5,5,6 
6,155,6   

我想替换2 sigma之外的所有列中的异常值。使用下面的代码,我可以创建一个没有异常值的数据帧。

df[df.apply(lambda x: np.abs(x - x.mean()) / x.std() < 2).all(axis=1)]


c1,c2,c3 
1,3,4 
2,5,6 
4,3,4 
5,5,6

我可以分别找到每列的异常值并用&#34; nan&#34;替换,但这不是最好的方法,因为代码中的行数随列数的增加而增加。必须有更好的方法来做到这一点。可以是上面命令对行的布尔输出,然后替换&#34; TRUE&#34;与&#34; nan&#34;。

任何建议,非常感谢。

2 个答案:

答案 0 :(得分:4)

<强> pandas
使用pd.DataFrame.mask

df.mask(df.sub(df.mean()).div(df.std()).abs().gt(2))

    c1   c2  c3 
0  NaN  1.0  2.0
1  1.0  3.0  4.0
2  2.0  5.0  6.0
3  3.0  1.0  NaN
4  4.0  3.0  4.0
5  5.0  5.0  6.0
6  6.0  NaN  6.0

numpy

v = df.values
mask = np.abs((v - v.mean(0)) / v.std(0)) > 2
pd.DataFrame(np.where(mask, np.nan, v), df.index, df.columns)

    c1   c2  c3 
0  NaN  1.0  2.0
1  1.0  3.0  4.0
2  2.0  5.0  6.0
3  3.0  1.0  NaN
4  4.0  3.0  4.0
5  5.0  5.0  6.0
6  6.0  NaN  6.0

答案 1 :(得分:0)

lb = df.quantile(0.01)
ub = df.quantile(0.99)
df_new = df[(df < ub) & (df > lb)]
df_new

我正在使用四分位数间距方法来检测离群值。首先,它使用分位数函数计算df的下限和上限。然后,根据所有值应在下限和上限之间的条件,它会返回一个新的df,其异常值被NaN取代。