含/不含离群值的Pandas计算:多特征数据集离群值影响分析
离群值分析与统计量对比方案
背景与数据集
正在处理一个包含300余个特征的数据集,需谨慎决策离群值处理方式,不愿仓促删除数据。现有数据集如下:
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 0 | 100 | 99 | 1000 | 300 | 250 |
| 1 | 665 | 6 | 9 | 1 | 9 |
| 2 | 7 | 665 | 4 | 9 | 1 |
| 3 | 1 | 3 | 4 | 3 | 6 |
| 4 | 1 | 9 | 1 | 665 | 5 |
| 5 | 3 | 4 | 6 | 1 | 9 |
| 6 | 5 | 9 | 1 | 3 | 2 |
| 7 | 1 | 665 | 3 | 2 | 3 |
| 8 | 2 | 665 | 9 | 1 | 0 |
| 9 | 5 | 0 | 7 | 6 | 5 |
| 10 | 0 | 3 | 3 | 7 | 3 |
| 11 | 6 | 3 | 0 | 3 | 6 |
| 12 | 6 | 6 | 5 | 1 | 5 |
已实现的离群值探查代码
已编写代码生成名为_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表如下:
| outliers | percent | max_val | min_val | median | mean | |
|---|---|---|---|---|---|---|
| A | 2 | 15.3846 | 665 | 0 | 5 | 61.6923 |
| B | 3 | 23.0769 | 665 | 0 | 6 | 164.385 |
| C | 1 | 7.6923 | 1000 | 0 | 4 | 80.9231 |
| D | 2 | 15.3846 | 665 | 1 | 3 | 77.0769 |
| E | 1 | 7.6923 | 250 | 0 | 5 | 23.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
相关产品推荐
相关产品推荐

