如何按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)] )
原代码报错原因
你之前的写法存在两个问题:
df.groupby(['type'])['weight']返回的是分组对象,不是可直接比较的数值序列,不能直接用比较运算符判断- 你调用
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
相关产品推荐
相关产品推荐

