如何将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实现从字符串中找出字符1的位置以及个数的方法
Aug 25 Python
在Apache服务器上同时运行多个Django程序的方法
Jul 22 Python
python生成验证码图片代码分享
Jan 28 Python
Python爬虫获取整个站点中的所有外部链接代码示例
Dec 26 Python
Python实现查询某个目录下修改时间最新的文件示例
Aug 29 Python
解决python3 Pycharm上连接数据库时报错的问题
Dec 03 Python
python爬虫获取百度首页内容教学
Dec 23 Python
Django将默认的SQLite更换为MySQL的实现
Nov 18 Python
Python字节单位转换实例
Dec 05 Python
python编写softmax函数、交叉熵函数实例
Jun 11 Python
python 字符串格式化的示例
Sep 21 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 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
mysql 字段类型说明
2007/04/27 PHP
php中判断文件空目录是否有读写权限的函数代码
2012/08/07 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
另类调用flash无须激活的方法
2006/12/27 Javascript
Javascript 圆角div的实现代码
2009/10/15 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
JS的replace方法介绍
2012/10/20 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
JavaScript组合拼接字符串的效率对比测试
2014/11/06 Javascript
jQuery插件开发精品教程(让你的jQuery更上一个台阶)
2015/11/07 Javascript
Javascript之BOM(window对象)详解
2016/05/25 Javascript
JavaScript对象数组排序实例方法浅析
2016/06/15 Javascript
JavaScript严格模式详解
2017/01/16 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
详解如何解决Vue和vue-template-compiler版本之间的问题
2018/09/17 Javascript
小程序关于请求同步的总结
2019/05/05 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
如何基于jQuery实现五角星评分
2020/09/02 jQuery
js实现简单的无缝轮播效果
2020/09/05 Javascript
Python 实现选择排序的算法步骤
2018/04/22 Python
python实现简单加密解密机制
2019/03/19 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
python实现3D地图可视化
2020/03/25 Python
python图片合成的示例
2020/11/09 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
HUGO BOSS美国官方网上商店:世界知名奢侈品牌
2017/08/04 全球购物
说一下mysql, oracle等常见数据库的分页实现方案
2012/09/29 面试题
家长会邀请书
2014/01/25 职场文书
运动会广播稿诗歌版
2014/09/12 职场文书
学院党的群众路线教育实践活动第一阶段情况汇报
2014/10/25 职场文书
2014年副班长工作总结
2014/12/10 职场文书
学雷锋献爱心倡议书
2015/04/27 职场文书
高二化学教学反思
2016/02/22 职场文书
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
2021/04/27 Python