首页 > 解决方案 > pandas group by 删除异常值

问题描述

我想按组删除基于百分位 99 值的异常值。

 import pandas as pd
 df = pd.DataFrame({'Group': ['A','A','A','B','B','B','B'], 'count': [1.1,11.2,1.1,3.3,3.40,3.3,100.0]})

在输出中,我想从 A 组中删除 11.2,从 B 组中删除 100。所以在最终数据集中只有 5 个观察值。

wantdf = pd.DataFrame({'Group': ['A','A','B','B','B'], 'count': [1.1,1.1,3.3,3.40,3.3]})

我试过这个,但我没有得到想要的结果

df[df.groupby("Group")['count'].transform(lambda x : (x<x.quantile(0.99))&(x>(x.quantile(0.01)))).eq(1)]

标签: pythonpython-3.xpandaspandas-groupby

解决方案


这是我的解决方案:

def is_outlier(s):
    lower_limit = s.mean() - (s.std() * 3)
    upper_limit = s.mean() + (s.std() * 3)
    return ~s.between(lower_limit, upper_limit)

df = df[~df.groupby('Group')['count'].apply(is_outlier)]

您可以编写自己的 is_outlier 函数


推荐阅读