我有一个包含 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
我可以分别找到每一列的异常值并用“nan”替换,但这不是最好的方法,因为代码中的行数随着列数的增加而增加。必须有更好的方法来做到这一点。可能是上述行命令的 bool 输出,然后将“TRUE”替换为“nan”。
任何建议,非常感谢。
最佳答案
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
关于Pandas:用 nan 替换所有列中的异常值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46576147/