python - 使用 IQR 在 Pandas df 中标记异常值
问题描述
我想为按 store_id 划分的整体daily_visitors识别低于第25 个百分位或高于第75 个百分位的异常值,并在新列中将它们标记为1 == 异常值和0 == 无异常值
主DF
date store_id store_category daily_visitors
2020-01-01 1 small 190
2020-01-02 1 small 187
2020-01-03 1 small 145
2020-01-04 1 small 156
2020-01-05 1 small 134343
2020-01-01 2 large 4635
2020-01-02 2 large 4321
2020-01-03 2 large 4534
2020-01-04 2 large 4242
2020-01-05 2 large 21
输出DF
date store_id store_category daily_visitors outlier
2020-01-01 1 small 190 0
2020-01-02 1 small 187 0
2020-01-03 1 small 145 0
2020-01-04 1 small 156 0
2020-01-05 1 small 134343 1
2020-01-01 2 large 4635 0
2020-01-02 2 large 4321 0
2020-01-03 2 large 21 1
2020-01-04 2 large 4242 0
2020-01-05 2 large 21 0
解决方案
您可以使用np.select
:
In [2272]: conditions = [df.daily_visitors > df.groupby('store_id')['daily_visitors'].transform('quantile', 0.75), df.daily_visitors < df.groupby('store_id')['daily_visitors'].transform('quantile', 0.25)]
In [2273]: choices = [1,1]
In [2276]: df['outlier'] = np.select(conditions, choices)
In [2277]: df
Out[2277]:
date store_id store_category daily_visitors outlier
0 2020-01-01 1 small 190 0
1 2020-01-02 1 small 187 0
2 2020-01-03 1 small 145 1
3 2020-01-04 1 small 156 0
4 2020-01-05 1 small 134343 1
5 2020-01-01 2 large 4635 1
6 2020-01-02 2 large 4321 0
7 2020-01-03 2 large 4534 0
8 2020-01-04 2 large 4242 0
9 2020-01-05 2 large 21 1
推荐阅读
- python - Selenium python:等待并检查xpath是否不包含字符串
- join - 谷歌云存储解决方案,在基于公共列的存储桶文件中加入 2 个 CSV
- python - Python中集合列表的频率或计数
- email - 尖括号中的 UNC 链接
- elasticsearch - Open Distro Elasticsearch - 从 IP 范围禁用基本身份验证
- json - 是什么导致 internalBinding('errors') [ERR_MODULE_NOT_FOUND] 将 repo 放入在线代码编辑器中?
- assembly - 在 asm 中打印一个浮点数
- python-3.x - 在 Pipeline 的帮助下使用 SelectKBest 或卡方或 ANOVA 删除冗余特征?
- excel - 使用带有 VBA 的表格从另一个工作表复制和粘贴
- python - 在 python 3.6.8 中使用正则表达式的语法无效