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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 09:51:00