如何按列将Pandas DataFrame中的异常值替换为np.nan?
问题原因及解决方法
- 核心问题:你用了
df_ex.apply(outliers, axis=1),其中axis=1是按行处理每个数据行,而你需要的是按列计算列内的异常值,方向完全搞反了。 - 为什么结果不对:
axis=1时,outliers函数会接收每一行作为独立的Series,计算该行的分位数和IQR,判断该行内的异常值——这和你要的“按列统计整列数据的异常值”逻辑完全不符。
修正后的代码
把axis=1改成axis=0(或者直接省略,因为apply默认axis=0就是按列处理):
import pandas as pd import numpy as np df_ex = pd.DataFrame({ 'a': [np.nan,np.nan,2.0,-0.5,6,120], 'b': [1, 3, 4, 2,40,11], 'c': [np.nan, 2, 3, 4,2,2], 'd': [6, 2.2, np.nan, 0,3,3], 'e': [12, 4, np.nan, -5,5,5], 'f': [2, 3, 8, 2,12,8], 'g': [3, 3, 9.0, 11, np.nan,2]}) def outliers(s, replace=np.nan): # 计算分位数时跳过NaN,避免干扰统计结果 Q1, Q3 = np.percentile(s.dropna(), [25 ,75]) IQR = Q3 - Q1 return s.where((s >= (Q1 - 1.5 * IQR)) & (s <= (Q3 + 1.5 * IQR)), replace) # 按列处理异常值,axis=0可省略 df_ex_o = df_ex.apply(outliers, axis=0) print(df_ex_o)
处理效果说明
修正后会按列统计异常值:
- 列
a中的120会被替换为NaN(属于列内极端值) - 列
b中的40会被替换为NaN(属于列内极端值) - 原DataFrame中的NaN会保留,其他正常数据不受影响
内容的提问来源于stack exchange,提问作者Zen4ttitude
相关产品推荐
相关产品推荐

