You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含/不含离群值的Pandas计算:多特征数据集离群值影响分析

离群值分析与统计量对比方案

背景与数据集

正在处理一个包含300余个特征的数据集,需谨慎决策离群值处理方式,不愿仓促删除数据。现有数据集如下:

ABCDE
0100991000300250
16656919
27665491
313436
41916655
534619
659132
71665323
82665910
950765
1003373
1163036
1266515

已实现的离群值探查代码

已编写代码生成名为_outliers的分析表用于离群值探查:

Q1 = df.quantile(0.25)
Q3 = df.quantile(0.75)
IQR = (Q3 - Q1)
min_ = (Q1 - (1.5 * IQR))
max_ = (Q3 + (1.5 * IQR))
# 统计各列离群值数量
_outliers = ((df.le(min_)) | (df.ge(max_))).sum().to_frame(name="outliers")
# 计算离群值占该列数据的百分比(修正为以数据集总样本量为分母)
_outliers["percent"] = (_outliers['outliers'] / len(df)) * 100
# 列最大值
_outliers["max_val"] = df[_outliers.index].max()
# 列最小值
_outliers["min_val"] = df[_outliers.index].min()
# 列中位数
_outliers["median"] = df[_outliers.index].median()
# 列均值
_outliers["mean"] = df[_outliers.index].mean()

生成的离群值探查结果

运行上述代码后得到的_outliers表如下:

outlierspercentmax_valmin_valmedianmean
A215.38466650561.6923
B323.076966506164.385
C17.692310000480.9231
D215.38466651377.0769
E17.69232500523.3846

扩展分析方案:保留原数据,对比含/不含离群值的统计量

核心逻辑:用~过滤非离群值

通过~对离群值判断条件取反,即可筛选出各列的非离群值,进而计算移除离群值后的统计量,无需修改原数据集。

完整代码实现(补充多维度统计量)

# 定义离群值判断掩码
outlier_mask = (df.le(min_)) | (df.ge(max_))

# 补充含离群值的统计量:偏度、标准差、方差、样本量
_outliers["skew"] = df.skew()
_outliers["std"] = df.std()
_outliers["var"] = df.var()
_outliers["sample_size"] = len(df)

# 计算移除离群值后的各项统计量
non_outlier_stats = {}
for col in df.columns:
    # 筛选当前列的非离群值
    non_outliers = df[col][~outlier_mask[col]]
    non_outlier_stats[col] = {
        "mean_no_outlier": non_outliers.mean(),
        "median_no_outlier": non_outliers.median(),
        "std_no_outlier": non_outliers.std(),
        "var_no_outlier": non_outliers.var(),
        "skew_no_outlier": non_outliers.skew(),
        "sample_size_no_outlier": len(non_outliers)
    }

# 转换为DataFrame并合并到原_outliers表
non_outlier_df = pd.DataFrame(non_outlier_stats).T
_outliers = _outliers.join(non_outlier_df)

额外实用分析技巧

  • 快速定位离群值最多的特征:使用nlargest()排序
    # 按离群值数量降序取前5个特征
    top_outlier_features = _outliers.nlargest(5, "outliers")
    
  • 基于统计量筛选特征:可根据方差、均值等阈值过滤特征,例如保留方差大于100的特征
    # 筛选方差大于100的特征
    filtered_features = _outliers[_outliers["var"] > 100].index.tolist()
    
  • 机器学习场景参考:部分场景可直接保留离群值进入模型训练,提前做统计量对比能明确离群值对模型结果的潜在影响。

内容的提问来源于stack exchange,提问作者Zen4ttitude

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 19:50:26