使用IQR移除异常值后,绘制箱线图提示无法识别列的问题求助
问题原因与解决方案
你的核心问题是函数返回的不是过滤后的原数据集,而是仅包含布尔/整数掩码的DataFrame,里面根本没有"Umur"和"Skor Belanja (1-100)"这些原始列,所以seaborn找不到指定列报错。
错误分析
- 原函数中
df_final = ~((df<...) | (df>...)).any(axis=1)生成的是一个布尔Series,每行标记该数据行是否无异常值 - 你把这个Series转成DataFrame返回,导致最终的
df_outlier_removed只有一列布尔/整数数据,完全丢失了原始的年龄、消费评分数据 - 转成整数类型只是把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
相关产品推荐
相关产品推荐

