在一行范围内检测离群值

时间:2019-08-18 21:01:35

标签: python pandas outliers

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

 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']

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

3 个答案:

答案 0 :(得分:2)

您可以使用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

注释:在这种情况下,由于没有异常值,我们将所有行退回。

答案 1 :(得分:1)

我认为使用groupby非常合理。然后,我将使用例如get_group方法获得单个组。最后,您可以进行所需的任何分析,如果错过了此示例,请参见此示例

Detect and exclude outliers in Pandas data frame

干杯和干得好,我也会关注这个问题

答案 2 :(得分:1)

我将手动进行一些操作:

假设您的df是这个(请注意,我在底部添加了2行)

    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
10  Manhattan   28
11  Manhattan   280

让我们添加2列以便于此处:

df['mean']=df.groupby('neighbourhood_group').transform('mean')
df['std'] = df.groupby('neighbourhood_group')['price'].transform('std')

如果is_outlier要求真/假

df['is_outlier'] = df.apply(lambda x: x['price']+x['std']<x['mean'] or x['price']-x['std']>x['mean'], axis=1)

结果

    neighbourhood_group price   mean              std   is_outlier
0   Brooklyn            149     99.333333   45.390895   True
1   Manhattan           225     141.222222  82.308532   True
2   Manhattan           150     141.222222  82.308532   False
3   Brooklyn            89      99.333333   45.390895   False
4   Manhattan           80      141.222222  82.308532   False
5   Manhattan           200     141.222222  82.308532   False
6   Brooklyn            60      99.333333   45.390895   False
7   Manhattan           79      141.222222  82.308532   False
8   Manhattan           79      141.222222  82.308532   False
9   Manhattan           150     141.222222  82.308532   False
0   Manhattan           28      141.222222  82.308532   True
1   Manhattan           280     141.222222  82.308532   True

也:@Willem Van Onsem指出,“异常值”的定义通常在平均值之上/之下3 sigma。在您的工作中考虑这一点,您可以定义与均值的偏差(我使用std = 1)