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

如何按type分组基于95百分位数去除pandas DataFrame中的异常值

可行实现方案

方案1:使用transform生成匹配原表长度的分组分位序列(推荐,性能更高)

import numpy as np

my_perc = 95
# 按type分组计算每个分组的95百分位数,并广播到原DataFrame的对应行
group_q95 = df.groupby('type')['weight'].transform(lambda x: np.percentile(x, my_perc))
# 过滤保留weight小于对应分组95分位的记录
df_filtered = df[df['weight'] < group_q95]

方案2:使用groupby.apply逐组处理

import numpy as np

my_perc = 95
df_filtered = df.groupby('type', group_keys=False).apply(
    lambda group: group[group['weight'] < np.percentile(group['weight'], my_perc)]
)

原代码报错原因

你之前的写法存在两个问题:

  1. df.groupby(['type'])['weight']返回的是分组对象,不是可直接比较的数值序列,不能直接用比较运算符判断
  2. 你调用np.percentile(df.weight, my_perc)是计算全表的95百分位数,不符合「按type单独计算分位」的需求

验证结果(基于你给出的示例数据)

处理后将过滤掉2条异常记录:

  • type=a的250.8(a组95分位约为218.91)
  • type=b的102.0(b组95分位约为101.73)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:45:02