相关文章推荐
闯红灯的八宝粥  ·  使用DBSCAN找出数据集中的异常值_dbs ...·  1 月前    · 
面冷心慈的仙人球  ·  数据清洗-异常值处理-DBSCAN算法查找异常值·  1 月前    · 
读研的充电器  ·  Spring ...·  1 年前    · 
坚强的遥控器  ·  Matlab 和Python结合使用 - 简书·  1 年前    · 
直爽的黑框眼镜  ·  Android ...·  2 年前    · 
Code  ›  python - 使用百分位数删除 Pandas DataFrame 中的异常值 -
pandas dataframe 百分位数 异常值
https://segmentfault.com/q/1010000043226364
愉快的柚子
1 年前
segmentfault segmentfault
注册登录
问答 博客 标签 活动
发现
✓ 使用“Bing”搜本站 使用“Google”搜本站 使用“百度”搜本站 站内搜索
注册登录
  1. 首页
  2. 问答
  3. Stack Overflow 翻译
  4. 问答详情

使用百分位数删除 Pandas DataFrame 中的异常值

社区维基
1
发布于
1 月 3 日
新手上路,请多包涵

我有一个包含 40 列和许多记录的 DataFrame df。

 User_id | Col1 | Col2 | Col3 | Col4 | Col5 | Col6 | Col7 |...| Col39

对于除 user_id 列之外的每一列,我想检查异常值并删除整个记录,如果出现异常值。

对于每一行的离群值检测,我决定简单地使用第 5 个和第 95 个百分位数(我知道这不是最好的统计方法):

编码我到目前为止所拥有的:

 P = np.percentile(df.Col1, [5, 95])
new_df = df[(df.Col1 > P[0]) & (df.Col1 < P[1])]

问题:如何在不手动执行此操作的情况下将此方法应用于所有列( User_id 除外)?我的目标是获得一个没有异常值记录的数据框。

原文由 Mi Funk 发布,翻译遵循 CC BY-SA 4.0 许可协议

Stack Overflow 翻译 python pandas outliers
阅读 363
2 个回答
得票 最新
社区维基
1
发布于
1 月 3 日
✓ 已被采纳

初始数据集。

 print(df.head())
   Col0  Col1  Col2  Col3  Col4  User_id
0    49    31    93    53    39       44
1    69    13    84    58    24       47
2    41    71     2    43    58       64
3    35    56    69    55    36       67
4    64    24    12    18    99       67

首先删除 User_id 列

filt_df = df.loc[:, df.columns != 'User_id']

然后,计算百分位数。

 low = .05
high = .95
quant_df = filt_df.quantile([low, high])
print(quant_df)
       Col0   Col1  Col2   Col3   Col4
0.05   2.00   3.00   6.9   3.95   4.00
0.95  95.05  89.05  93.0  94.00  97.05

接下来根据计算的百分位数过滤值。为此,我按列使用 apply 就是这样!

 filt_df = filt_df.apply(lambda x: x[(x>quant_df.loc[low,x.name]) &
                                    (x < quant_df.loc[high,x.name])], axis=0)

将 User_id 带回来。

 filt_df = pd.concat([df.loc[:,'User_id'], filt_df], axis=1)

最后,具有 NaN 值的行可以像这样简单地删除。

 filt_df.dropna(inplace=True)
print(filt_df.head())
   User_id  Col0  Col1  Col2  Col3  Col4
1       47    69    13    84    58    24
3       67    35    56    69    55    36
5        9    95    79    44    45    69
6       83    69    41    66    87     6
9       87    50    54    39    53    40
print(filt_df.head())
   User_id  Col0  Col1  Col2  Col3  Col4
0       44    49    31   NaN    53    39
1       47    69    13    84    58    24
2       64    41    71   NaN    43    58
3       67    35    56    69    55    36
4       67    64    24    12    18   NaN
print(filt_df.describe())
          User_id       Col0       Col1       Col2       Col3       Col4
count  100.000000  89.000000  88.000000  88.000000  89.000000  89.000000
mean    48.230000  49.573034  45.659091  52.727273  47.460674  57.157303
std     28.372292  25.672274  23.537149  26.509477  25.823728  26.231876
min      0.000000   3.000000   5.000000   7.000000   4.000000   5.000000
25%     23.000000  29.000000  29.000000  29.500000  24.000000  36.000000
50%     47.000000  50.000000  40.500000  52.500000  49.000000  59.000000
75%     74.250000  69.000000  67.000000  75.000000  70.000000  79.000000
max     99.000000  95.000000  89.000000  92.000000  91.000000  97.000000

如何生成测试数据集

np.random.seed(0)
nb_sample = 100
num_sample = (0,100)
d = dict()
d['User_id'] = np.random.randint(num_sample[0], num_sample[1], nb_sample)
for i in range(5):
    d['Col' + str(i)] = np.random.randint(num_sample[0], num_sample[1], nb_sample)
df = DataFrame.from_dict(d)
 
推荐文章
闯红灯的八宝粥  ·  使用DBSCAN找出数据集中的异常值_dbscan异常
1 月前
面冷心慈的仙人球  ·  数据清洗-异常值处理-DBSCAN算法查找异常值
1 月前
读研的充电器  ·  Spring boot视频播放(解决MP4大文件无法播放),整合ffmpeg,用m3u8切片播放。_springboot 返回mp4-CSDN博客
1 年前
坚强的遥控器  ·  Matlab 和Python结合使用 - 简书
1 年前
直爽的黑框眼镜  ·  Android Jetpack组件之WorkManager后台任务管理的介绍与使用(二)_51CTO博客_android jetpack navigation
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号