鱼C论坛

 找回密码
 立即注册
查看: 3182|回复: 8

如何快速地将异常值,替换成缺失值

[复制链接]
发表于 2019-6-12 15:15:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求教~~
有五列数据,每列数据都有各自的限值,如何快速地将超出限值的数值替换成空值呢?
比如有X1,X2,X3,X4,X5 共5列。 X1的限值[0,a1], X2的限值为[0,a2]...;
我的做法是先将每列的限制装到一个字典中,方便取值。然后遍历数据表,发现超过限值的,便进行空值替换。
代码如下:
  1. #先将限值装入字典。(原限值放在一个独立文档中,方便外部修改调整)
  2. limitation  = {}
  3. for i in d_std.index:  #d_std即是限值的文档数据文件
  4.     limitation[i] = []
  5.     limitation[i].append(d_std.loc[i,['MAX','MIN']].values.tolist())
  6. for i in limitation:
  7.     max_std,min_std = limitation[i][0]  #针对不同的列,进行相应的限制赋值
  8.     outrange = (data0_new[i] > max_std) | (data0_new[i] < min_std) #查看数据是否超出限值,返回布尔值
  9.     data0_new[i] = [ np.nan for bool_value in outrange]  ##问题可能出在这一行上
复制代码

可是这样把原来所有的数值,全部替换成空值了。。
正确的代码,该怎么改呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-12 15:53:35 | 显示全部楼层
二维列表遍历就完事了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-12 15:58:30 | 显示全部楼层
都淡忘 发表于 2019-6-12 15:53
二维列表遍历就完事了

能否具体写下代码。。
因为我的数据量很大,如果两层遍历的话,耗时会很长。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-12 16:15:24 | 显示全部楼层
如果是用生成器呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-12 16:22:48 | 显示全部楼层
data0_new[outrange]=np.nan行不行。好久没有pd了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-12 16:29:33 | 显示全部楼层
本帖最后由 都淡忘 于 2019-6-12 16:38 编辑
  1. data_list = [[1,2,3],[2,3,4],[1,4,3],[2,4,5],[1,3,5]]# 二维列表
  2. compare_list = [[0,3],[1,2],[0,2],[1,2],[1,2]]# 比较的范围
  3. result_data_list = [[],[],[],[],[]]# 创建空列表存结果
  4. i = 0
  5. for each_column in data_list:
  6.     for each_nums in each_column:
  7.         if not compare_list[i][0] <= each_nums <= compare_list[i][1]:
  8.             result_data_list[i].append("")
  9.         else:
  10.             result_data_list[i].append(each_nums)
  11.     i += 1
  12. print(result_data_list)
复制代码

这就是简单的for循环遍历,如果数据量很大的话,这会很慢的。数据量超大此时就用生成器。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-12 16:36:48 | 显示全部楼层
插一句不管是用列表解析式还是生成器,都没有else这个选项,最开始我想着用列表解析式,写一半想起来没有else,也就是不能说把不符合条件替换和符合条件保留两个同时保留,生成器也是如此,
其实还是每个元素都要判断,跑不掉。符合条件保留,不符合条件替换。两个方案:
1.还是用for循环,费点时间
2.用生成器把不符合条件的数值的索引存起来,然后依据索引对应值进行替换。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-12 16:51:43 | 显示全部楼层
都淡忘 发表于 2019-6-12 16:36
插一句不管是用列表解析式还是生成器,都没有else这个选项,最开始我想着用列表解析式,写一半想起来没有el ...

谢谢。
不过经别人提醒,我就把我最后一行代码改了,就解决问题了。
  1. data0_new[i].where(~out_range,np.nan,inplace=True)
复制代码

where这个方法很好用,只有不满足前面的条件,才会进行赋值处理,而且满足条件的话,则原封不动。
其执行速度也超快。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-12 17:18:16 | 显示全部楼层
老笨啊 发表于 2019-6-12 16:51
谢谢。
不过经别人提醒,我就把我最后一行代码改了,就解决问题了。

对哦,引入NumPy库,这个where方法有else的东西包含在里面,我也记住了,哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-16 09:10

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表