python - 分组排除异常值的最有效方法是什么
问题描述
假设我有这样的数据框
channel | ID | cnt_txn | amount
A | 1 | 3 | 15
A | 2 | 5 | 20
B | 1 | 4 | 12
C | 3 | 3 | 12
C | 2 | 10 | 10
我有这个功能
def is_outlier(s):
lower_limit = s.mean() - (s.std() * 3)
upper_limit = s.mean() + (s.std() * 3)
return s.between(lower_limit, upper_limit)
按通道分组并将is_outlier
(或类似逻辑)功能应用于按通道分组中的每个数据的最简单和易读的方法是什么
我努力了
df.groupby(['vertical'])['cnt_txn','amount'].apply(is_outlier)
它导致
AttributeError: 'DataFrame' 对象没有属性 'between'
我猜它没有循环数据框中的每一列
如果有人可以解释这一点并提供解决方案将不胜感激,在此先感谢
解决方案
根据目前的知识,感谢@Phung Duy Phong
指出逻辑。
离群函数应该看起来像这样,以加快 groupby 的性能
def is_outlier(x):
return (x<x.quantile(0.95))&(x>(x.quantile(0.05)))
和 groupby 语句应该是这样的
df[df.groupby(['channel'])['cnt_txn','amount'].apply(is_outlier).eq(1).all(axis=1)]
注意到.eq(1)
进来是为了简化结果True
而False
不是Nan
有价值
并且.all(axis=1)
是将返回数组组合成一维,说明所有列必须true
是true
最后df[arrayOfTrueFalse]
将返回没有异常值的数据帧
推荐阅读
- r - dplyr 中的 filter() 如何评估自定义函数中 () 中的内容?
- r - 如何从 R 项目中删除脚本
- python - 使用 Numpy 的余弦相似度函数
- mysql - 替换phpmyadmin中以开头和结尾的字符串
- node.js - StaticInjectorError(AppModule)[AppComponent -> DataService]
- php - 多个应用程序,同一域下的多个应用程序版本。如何配置 apache 服务器、路由和相对路径以使其工作?
- r - 改变sclass图中符号的颜色
- node.js - VS Code 没有为在 Docker 容器中运行的 Node 应用程序打断点
- kubernetes - Prometheus Adapter 清空自定义指标项
- javascript - 如何使用 replace() 方法更改 Javascript 中字符串的所有字符?