我有一个包含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;。
任何建议,非常感谢。
答案 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取代。