Pandas如何将超出列均值±3倍标准差范围的元素替换为np.nan
按列3σ阈值替换异常值为NaN的实现
直接利用pandas的对齐广播机制即可,无需逐列循环,支持原地修改,适配任意列数的DataFrame。
核心实现代码
import numpy as np # 按列计算统计阈值 col_means = df.mean() col_stds = df.std(ddof=1) # 默认ddof=1为样本标准差,需总体标准差则设ddof=0 lower = col_means - 3 * col_stds upper = col_means + 3 * col_stds # 原地替换超出范围的值为np.nan df.mask( cond=(df < lower) | (df > upper), other=np.nan, inplace=True )
之前用where方法未成功的原因
where和mask的判断逻辑完全相反:
mask:满足cond条件的位置,替换为other值where:不满足cond条件的位置,替换为other值
如果要用where实现相同效果,写法如下:
df.where( cond=(df >= lower) & (df <= upper), other=np.nan, inplace=True )
说明
- 计算得到的
lower、upper是和df列索引一一对应的Series,和DataFrame做比较时pandas会自动把每列的阈值广播到整列所有行,天然适配“每列用自身均值、标准差计算阈值”的需求,不管是1列还是11列都可以直接运行,不需要额外调整。 - 不需要写逐列的apply/lambda函数,向量化运算的效率远高于逐元素/逐列循环。
内容的提问来源于stack exchange,提问作者ananvodo
相关产品推荐
相关产品推荐

