在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
相关产品推荐
相关产品推荐

