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

使用IQR移除异常值后,绘制箱线图提示无法识别列的问题求助

问题原因与解决方案

你的核心问题是函数返回的不是过滤后的原数据集,而是仅包含布尔/整数掩码的DataFrame,里面根本没有"Umur"和"Skor Belanja (1-100)"这些原始列,所以seaborn找不到指定列报错。

错误分析

  1. 原函数中df_final = ~((df<...) | (df>...)).any(axis=1)生成的是一个布尔Series,每行标记该数据行是否无异常值
  2. 你把这个Series转成DataFrame返回,导致最终的df_outlier_removed只有一列布尔/整数数据,完全丢失了原始的年龄、消费评分数据
  3. 转成整数类型只是把True/False变成1/0,本质还是没有原数据列,所以绘图报错

修正后的函数

修改函数逻辑,让它返回过滤掉异常值后的原始数据集,而不是掩码:

import pandas as pd

def remove_outlier_IQR(df):
    q1 = df.quantile(0.25)
    q3 = df.quantile(0.75)
    inter_q = q3 - q1
    # 生成每行的无异常值标记
    mask = ~((df < (q1 - 1.5 * inter_q)) | (df > (q3 + 1.5 * inter_q))).any(axis=1)
    # 用掩码过滤原数据集,返回保留原始列的结果
    return df[mask].copy()

正确调用与绘图流程

# 传入需要处理的两列,得到过滤后的数据集
df_outlier_removed = remove_outlier_IQR(df[["Umur","Skor Belanja (1-100)"]])

# 直接绘制箱线图,此时数据集中包含"Umur"列
import seaborn as sns
sns.boxplot(x = "Umur", data=df_outlier_removed)

额外说明

  • 不需要再调用dropna,因为过滤后的结果都是符合条件的行,不存在缺失值
  • 如果需要保留原数据集的其他列,可以直接传入整个df(可调整函数逻辑支持指定列),当前需求只处理两列,按上述方式调用即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 18:57:11