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

在Pandas中按类别过滤99.9分位数异常值并使用Seaborn绘图

筛选分组异常值并绘制Seaborn图表

嘿,作为Pandas和Seaborn新手,你已经迈出了关键一步——算出了每个分组的99.9分位数阈值!接下来的筛选其实很简单,我给你两种实用的方法,选你觉得顺手的来:

方法一:用transform直接计算并过滤(最简洁)

这种方法不需要单独处理阈值DataFrame,直接在原数据上分组计算阈值,然后一次性完成筛选:

# 1. 给原DataFrame添加一列,存储每个(Cat, RPS)分组的99.9分位数阈值
df['threshold_999'] = df.groupby(['Cat', 'RPS'])['latency_ns'].transform(lambda x: x.quantile(0.999))

# 2. 筛选出latency_ns超过对应分组阈值的异常值
outliers_df = df[df['latency_ns'] > df['threshold_999']]

transform的好处是会把分组计算的结果自动匹配到原数据的每一行,不用手动合并,非常省心!

方法二:合并阈值DataFrame后过滤(更直观)

如果你已经有了单独的阈值DataFrame(就是你用groupby.quantile得到的那个),可以先把它整理成和原数据匹配的格式,再合并过滤:

# 假设你的阈值DataFrame叫quantiles_df,先重置索引让分组键变成普通列
quantiles_df = quantiles_df.reset_index()
# 重命名阈值列避免和原数据的latency_ns冲突
quantiles_df = quantiles_df.rename(columns={'latency_ns': 'threshold_999'})

# 1. 把原数据和阈值数据按Cat、RPS分组合并
merged_df = pd.merge(df, quantiles_df, on=['Cat', 'RPS'], how='left')

# 2. 筛选异常值
outliers_df = merged_df[merged_df['latency_ns'] > merged_df['threshold_999']]

用Seaborn绘制异常值

拿到outliers_df之后,就可以用你参考的示例代码来绘图了,只需要把data参数换成筛选后的异常值数据:

import seaborn as sns
import matplotlib.pyplot as plt

ax = sns.stripplot(
    x="Cat", 
    y="latency_ns", 
    hue="RPS", 
    data=outliers_df, 
    jitter=True, 
    palette="Set2", 
    dodge=True
)
plt.title("99.9th Percentile Outliers of Latency by Cat and RPS")
plt.show()

这样就能精准展示每个(Cat, RPS)分组里的异常值啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:33:41