如何使用boxplot_stats提取箱线图中特定类别对应的异常值
问题根因
你当前对全量sepal_length列计算异常值,但可视化时是按species分组单独绘制箱线图,每个分组会独立计算分位数、IQR和异常值判定阈值,全量数据的判定阈值和分组阈值完全不同,因此会出现全局无异常值、分组存在异常值的情况。
解决方法
按物种分组后,对每个分组的花萼长度数据单独计算箱线图统计量,即可拿到和可视化结果一致的分组异常值。
示例代码1:提取每个物种的异常值列表
import seaborn as sns from matplotlib.cbook import boxplot_stats df = sns.load_dataset('iris') # 按物种分组计算异常值 species_outliers = {} for species, group_df in df.groupby("species"): # 提取当前分组的箱线图统计结果 stats = boxplot_stats(group_df["sepal_length"])[0] species_outliers[species] = stats["fliers"].tolist() # 输出结果 for sp, outliers in species_outliers.items(): print(f"{sp}的异常值:{outliers}")
示例代码2:提取异常值对应的完整原始数据行
如果需要拿到异常值对应的整行样本数据,可以使用以下代码:
import pandas as pd outlier_rows = [] for species, group_df in df.groupby("species"): fliers = boxplot_stats(group_df["sepal_length"])[0]["fliers"] # 筛选当前分组内属于异常值的行 group_outliers = group_df[group_df["sepal_length"].isin(fliers)] outlier_rows.append(group_outliers) # 合并所有异常值行 all_outlier_df = pd.concat(outlier_rows) print(all_outlier_df)
内容的提问来源于stack exchange,提问作者Ailurophile
相关产品推荐
相关产品推荐

