如何将numpy二维数组中的np.nan值替换为指定的值


Posted in Python onMay 14, 2021

基础知识:

(1)np.nan表示该值不是一个数,比如数据中收入、年龄的缺失值;np.inf表示无穷大

(2)np.nan == np.nan 的结果为False

(3)nan与任何数的操作结果均为nan,例如sum((np.nan,4)) 的结果为nan

(4)一个ndarray数组t1,可以用np.isnan(t1) 定位到nan值的位置,再用t1[np.isnan(t1)] = 指定值 将nan替换为指定值

(5)np.nan_to_num(t1),可以将t1中的nan替换为0

(6)t1[ t1 == t1]可以剔除所有nan只保留非nan值

现在生成一个3*4的数组,设定第1行,第2、3列位置两个元素为np.nan

import numpy as np
t1 = np.arange(12).reshape(3,4).astype('float')
t1[1,2:] = np.nan
print(t1)

[[ 0. 1. 2. 3.]

[ 4. 5. nan nan]

[ 8. 9. 10. 11.]]

1. 问题1:

如何将t1中的nan替换为0

#方法1:
for i in range(t1.shape[1]):
    col = t1[:,i]
    col[np.isnan(col)] = 0
#方法2:调用np.nan_to_num方法
t1 = np.nan_to_num(t1)
#方法3:或用np.isnan(t1)做索引,然后替换,建议用该方法
t1[np.isnan(t1)] = 0

方法3不但可以替换为0,替换为其它值也可,建议使用。

2. 问题2:

如何将t1中的nan替换为某些计算之后的值,例如将其替换为该列所有非 nan元素的均值

将原始数据中缺失的值替换为0有时未必是合适的。例如原始数据中某些人的年龄没有填,如果替换为0,将来在计算年龄平均值或做数据分析时就存在不合理的后果。此时,将年龄缺失的的人的年龄设为均值更为合理。

(1)方法1

#方法1:
for i in range(t1.shape[1]):
    col = t1[:,i]
    #当前列中如果存在nan,由于np.nan不等于np.nan,所以如果某列中存在nan,则col!=col将会有元素为True,np.count_nonzero方法将会累计值为True的元素数量,可以通过这种方法来判断该列是否存在nan
    nan_num = np.count_nonzero(col != col)
    if nan_num:
        not_nan_col = col[col == col] #用布尔矩阵col == col做索引来筛选矩阵,布尔矩阵中False位置的元素将被剔除。
        col[np.isnan(col)] = not_nan_col.mean()
print(t1)

运行结果:

[[ 0. 1. 2. 3.]

[ 4. 5. 6. 7.]

[ 8. 9. 10. 11.]]

(2)方法2

#方法2:np.nanmean方法可以计算非nan值的均值,此外还有np.nanmax, np.nanmin方法。所以上述程序可以改写如下:
mean = np.nanmean(t1,axis=0)
print('各列的均值为:%s' %mean)
for i in range(t1.shape[1]):
    col = t1[:,i]
    col[np.isnan(col)] = mean[i]
print(t1)

运行结果同上

(3)方法3

使用功能强大的pandas库

#也可以用pandas来处理,更为简单便捷
import pandas as pd
df = pd.DataFrame(t1)
t1 = df.fillna(df.mean()).values  #values代替as_matrix(),可以将DataFrame转换为ndarray
print(t1)

运行结果同上。

补充:python 快速替换Numpy 中的Nan(空值)和inf (无限值)

在做数据处理的时候由于要保证数据的个数不变,需要把数据中的空值和无穷值替换为指定的值(此处为255),考虑到数据量比较大(50000000条数据),效率也是一个考虑因素。

下面主要给出了替换数据的核心代码

# +--+--+--+--+--+--+--+--+--+--+
print('Predict New Data......')
start = datetime.datetime.now()

dataPre = input_Data   # 此处输入需要处理的原始数据

# 0: 00:23.012951  标记了这个方法的时间(以50000000条数据为例)
dataPre0 = np.array(dataPre)
dataPre0[np.isnan(dataPre0)] = 255
dataPre0[np.isinf(dataPre0)] = 255

# 0:02:03.038840
dataPre1 = (dataPre)
dataPre1 = dataPre1.replace([np.inf, -np.inf], np.nan)
dataPre1 = dataPre1.fillna(value = 255)

# 0:02:03.140287
dataPre2 = (dataPre)
dataPre2 = (dataPre2.replace([np.inf, -np.inf], np.nan)).fillna(value = 255)    # shi yong te ding shuju tian chong

# 0:00:30.346661
dataPre3 = np.array(dataPre)
dataPre3[(dataPre3 == float('inf')) | (dataPre3 == float('-inf')) | (dataPre3 == float('nan'))] = 255

# 0:00:19.702519
dataPre4 = np.array(dataPre)
dataPre4[np.isinf(dataPre4)] = np.nan  # 将数组里面的无穷值转为空值
dataPre4[np.isnan(dataPre4)] = 255  # # 将nan值替换为255

# 0:01:10.404677
dataPre5 = np.array(dataPre)
dataPre5 = np.where(np.isnan(dataPre5), 255, dataPre5)
dataPre5 = np.where(np.isinf(dataPre5), 255, dataPre5)

可以看出几种方法的效率差别还是比较大的,尤其是使用了replace或者np.where函数的方法,比较慢。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
跟老齐学Python之编写类之三子类
Oct 11 Python
Python入门篇之面向对象
Oct 20 Python
Python自动化开发学习之三级菜单制作
Jul 14 Python
python-opencv颜色提取分割方法
Dec 08 Python
python语言基本语句用法总结
Jun 11 Python
django一对多模型以及如何在前端实现详解
Jul 24 Python
tensorflow-gpu安装的常见问题及解决方案
Jan 20 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
Mar 30 Python
pandas分组聚合详解
Apr 10 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
Nov 06 Python
基于Python采集爬取微信公众号历史数据
Nov 27 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 Python
使用numpy nonzero 找出非0元素
May 14 #Python
Python机器学习之KNN近邻算法
May 14 #Python
Python爬虫基础讲解之请求
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 #Python
如何使用flask将模型部署为服务
May 13 #Python
教你用python控制安卓手机
Python数据分析入门之数据读取与存储
May 13 #Python
You might like
php实现在多维数组中查找特定value的方法
2015/07/29 PHP
PHP网页安全认证的实例详解
2017/09/28 PHP
php session_decode函数用法讲解
2019/05/26 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
使用Git实现Laravel项目的自动化部署
2019/11/24 PHP
Nigma vs Liquid BO3 第二场2.14
2021/03/10 DOTA
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
javascript中length属性的探索
2011/07/31 Javascript
使用jQuery实现验证上传图片的格式与大小
2014/12/03 Javascript
jQuery实现视频作为全屏幕背景
2014/12/18 Javascript
超精准的javascript验证身份证号的具体实现方法
2015/11/18 Javascript
js右下角弹出提示框示例代码
2016/01/12 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
Node.js使用NodeMailer发送邮件实例代码
2017/03/06 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
vue中的v-if和v-show的区别详解
2019/09/01 Javascript
element-ui tooltip修改背景颜色和箭头颜色的实现
2019/12/16 Javascript
js实现双人五子棋小游戏
2020/05/28 Javascript
[01:12]DOTA2次级职业联赛 - Newbee.Y 战队宣传片
2014/12/01 DOTA
[41:17]完美世界DOTA2联赛PWL S3 access vs CPG 第二场 12.13
2020/12/17 DOTA
python网页请求urllib2模块简单封装代码
2014/02/07 Python
Swift 3.0在集合类数据结构上的一些新变化总结
2016/07/11 Python
python类中super()和__init__()的区别
2016/10/18 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
python中的unittest框架实例详解
2021/02/05 Python
法国一家多品牌成衣精品中/高档商店:Graduate Store
2019/08/28 全球购物
公关关系专员的自我评价分享
2013/11/20 职场文书
初中女生自我鉴定
2013/12/19 职场文书
大一新生学期自我评价
2014/04/09 职场文书
化学教育专业求职信
2014/07/08 职场文书
通知的写法
2015/04/23 职场文书
本科毕业论文答辩稿
2015/06/23 职场文书
详解Python中*args和**kwargs的使用
2022/04/07 Python
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python