2017-10-05 122 views
2

替换中的所有列的离群值我有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西格玛的列。使用下面的代码,我可以创建一个没有异常值的数据框。

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 

我可以分别找到每个列的异常值,并与“南”代替,但不会是在与列数的增加代码的行数的最佳方式。必须有更好的方式来做到这一点。可能是上述命令的布尔输出行,然后用“nan”替换“TRUE”。

任何建议,非常感谢。

+0

你能确切地解释你的问题是什么?顺便说一句,你可以摆脱apply - 'df [df.sub(df.mean())。abs()。div(df.std())。(2).all(1)]' –

+0

我想用“nan”代替数据帧中的所有异常值(2 sigma范围以外)。如果不具备应用功能,则必须分别为每个列执行此操作。 – Sridhar

回答

2

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