iqr法检测异常值最稳健,先用quantile()计算q1、q3和iqr,再设上下界为q1−1.5×iqr与q3+1.5×iqr;需过滤非数值列、避免包含边界值,并结合业务判断打标而非直接删除。

用 quantile() 做 IQR 法检测数值列异常值
直接用四分位距(IQR)是最稳的起点,不依赖正态假设,对偏态分布也友好。核心是算出 Q1 和 Q3,再定义上下界:Q1 - 1.5 * IQR 和 Q3 + 1.5 * IQR。
实操时注意三点:
-
quantile()默认只作用于数值列,但如果你传入了含非数值列的DataFrame,得先用select_dtypes(include='number')过滤,否则报错TypeError: cannot interpolate with object dtype - IQR 系数 1.5 是经验阈值,业务敏感时可调成 1.0 或 2.0;别硬套,比如金融风控里日交易额波动大,用 2.0 更合理
- 边界值本身不算异常,所以过滤条件要用
和 <code>>,不是或 <code>>=
q1 = df['amount'].quantile(0.25) q3 = df['amount'].quantile(0.75) iqr = q3 - q1 lower_bound = q1 - 1.5 * iqr upper_bound = q3 + 1.5 * iqr mask = (df['amount'] upper_bound) df_clean = df[~mask].copy()
用 zscore() 判断标准差倍数异常(需 scipy)
当数据近似正态、且你关心“偏离均值多少个标准差”时,zscore() 比 IQR 更直观。但它对离群点本身敏感——一个极端值会拉高标准差,导致其他潜在异常被掩盖。
所以实际用法是:
- 必须从
scipy.stats导入,Pandas 自身没有zscore函数 - 别直接对整张表算 z-score,先用
select_dtypes('number')提取数值列,再逐列处理,避免ValueError: Input contains NaN, infinity or a value too large for dtype('float64') - z-score 绝对值 > 3 是常见阈值,但在小样本(n
from scipy.stats import zscore
numeric_cols = df.select_dtypes('number').columns
z_scores = np.abs(zscore(df[numeric_cols]))
mask = (z_scores > 3).any(axis=1)
df_clean = df[~mask].copy()
过滤后保留原始索引还是重置?
用布尔索引过滤(如 df[~mask])默认保留原索引,这在后续做时间序列对齐、或和另一个同索引 DataFrame 合并时是优势;但如果你准备喂给 sklearn 模型,索引断层可能引发 IndexError 或静默错位。
所以得按下游用途决定:
- 做 EDA 或导出报表:留原索引,方便回溯原始行号
- 进模型训练或交叉验证:加
.reset_index(drop=True),避免sklearn内部因索引跳变出问题 - 如果之后还要 merge 或 join,确认另一张表是否也用了相同索引策略,否则
pd.merge会丢行
字符串列混在 DataFrame 里会怎样?
只要没显式对它调用 quantile() 或 zscore(),Pandas 就不会报错——但它会悄悄跳过这些列。问题在于:当你写 df.select_dtypes('number') 时,如果某列看着像数字(比如 '123', '45.6' 字符串),它仍被归为 object 类型,不会进入数值列集合。
排查方法很简单:
- 运行
df.dtypes,检查目标列是不是真为int64或float64;如果不是,先用pd.to_numeric(..., errors='coerce')转换,把脏字符转成NaN - 别信列名,比如叫
'price'的列可能是字符串,df['price'].apply(type).unique()能快速验明正身 - 转换后立刻检查
df['price'].isna().sum(),大量NaN往往意味着原始数据有单位(如'$120')、逗号分隔符(如'1,200')等干扰
IQR 和 z-score 都不能代替业务判断。一个“异常”的销售额,可能是新渠道首发或大客户签约,直接删掉反而丢关键信号。真正该做的,是把检测结果打标(比如加一列 is_outlier),再交由业务方确认。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











