在给定的数据框架中,我有以下两列:
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']我想可能会有更好的解决办法。
发布于 2019-08-18 21:20:41
您可以使用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注意到:在本例中,我们会得到所有的行,因为没有异常值。
发布于 2019-08-18 21:27:57
我认为使用群比是完全有道理的。然后,我将获得单个组,例如使用get_group方法。最后,您可以进行任何需要的分析,请参阅此示例,以防您错过了该示例。
Detect and exclude outliers in Pandas data frame
干杯,干得好,我也会关注这个问题
发布于 2019-08-18 21:53:20
我会用手做一点:
让我们假设您的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西格玛。在您的工作中考虑这一点,您就可以定义偏离平均值(我使用了std=1)。
https://stackoverflow.com/questions/57548341
复制相似问题