在给定的数据帧中,我有这两列:
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']
我怀疑可能有一个更简单的解决方案。
答案 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)