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

标签 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

我可以分别找到每一列的异常值并用“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/

相关文章:

machine-learning - 使用 IsolationForest 检测高维数据集异常值的正确方法

python - 从 matplotlib : boxplot 中查找离群点

python - 异常值检测 DBSCAN

python - Groupby 和值计数类别

python - 测量数据框中接下来 N 行的偏差

PHP 正则表达式将两个斜杠 (//) 替换为新行

python - 替换 pandas Dataframe 列中的 Unicode 字符

python - 根据字典验证 pandas 数据帧值

python - Pandas :按日历周分组,然后为实际日期时间绘制分组条形图

html - 使用经典 asp 读取 html 页面并将其插入数据库