首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在一列中检测行范围内的异常值

在一列中检测行范围内的异常值
EN

Stack Overflow用户
提问于 2019-08-18 21:01:35
回答 3查看 83关注 0票数 1

在给定的数据框架中,我有以下两列:

代码语言:javascript
复制
 neighbourhood_group
 price

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

代码语言:javascript
复制
    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对价格进行分组,检测每个组中的异常值,并为需要删除的行创建一个掩码。

代码语言:javascript
复制
 data.groupby('neighbourhood_group')['price']

我想可能会有更好的解决办法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-18 21:20:41

您可以使用Groupby.apply,然后获取超出3 * std范围的所有值,同时使用mean对每个值进行减除。

代码语言:javascript
复制
m = df.groupby('neighbourhood_group')['price'].apply(lambda x: x.sub(x.mean()).abs() <= (x.std()*3))

df[m]

输出

代码语言:javascript
复制
  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

注意到:在本例中,我们会得到所有的行,因为没有异常值。

票数 2
EN

Stack Overflow用户

发布于 2019-08-18 21:27:57

我认为使用群比是完全有道理的。然后,我将获得单个组,例如使用get_group方法。最后,您可以进行任何需要的分析,请参阅此示例,以防您错过了该示例。

Detect and exclude outliers in Pandas data frame

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

票数 1
EN

Stack Overflow用户

发布于 2019-08-18 21:53:20

我会用手做一点:

让我们假设您的df是这样的(注意,我在底部增加了2行)

代码语言:javascript
复制
    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列以便于使用:

代码语言:javascript
复制
df['mean']=df.groupby('neighbourhood_group').transform('mean')
df['std'] = df.groupby('neighbourhood_group')['price'].transform('std')

如果is_outlier的话,让我们问真假

代码语言:javascript
复制
df['is_outlier'] = df.apply(lambda x: x['price']+x['std']<x['mean'] or x['price']-x['std']>x['mean'], axis=1)

结果

代码语言:javascript
复制
    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)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57548341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档