首页 > 解决方案 > 在一列内检测行范围内的异常值

问题描述

在给定的数据框中,我有这两列:

 neighbourhood_group
 price

价格列包含所有 neighbourhood_group 的所有价格:

    neighbourhood_group price
 0  Brooklyn            149
 1  Manhattan           225
 2  Manhattan           150
 3  Brooklyn            89
 4  Manhattan           80
 5  Manhattan           200
 6  Brooklyn            60
 7  Manhattan           79
 8  Manhattan           79
 9  Manhattan           150

我正在尝试检测每个neighbourhood_group 的异常值。

到目前为止,我提出的唯一想法是按 neighbourhood_group 按价格分组,检测每个组中的异常值,并为需要删除的行创建一个掩码。

 data.groupby('neighbourhood_group')['price']

我怀疑可能有一个更简单的解决方案。

标签: pythonpandasoutliers

解决方案


您可以使用Groupby.apply然后获取范围之外的所有值,3 * std同时用 减去每个值mean

m = df.groupby('neighbourhood_group')['price'].apply(lambda x: x.sub(x.mean()).abs() <= (x.std()*3))

df[m]

输出

  neighbourhood_group  price
0            Brooklyn    149
1           Manhattan    225
2           Manhattan    150
3            Brooklyn     89
4           Manhattan     80
5           Manhattan    200
6            Brooklyn     60
7           Manhattan     79
8           Manhattan     79
9           Manhattan    150

注意:在这种情况下,我们会取回所有行,因为没有异常值。


推荐阅读