如何将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多进程操作实例
Nov 21 Python
Python比较两个图片相似度的方法
Mar 13 Python
python通过apply使用元祖和列表调用函数实例
May 26 Python
python实现的多线程端口扫描功能示例
Jan 21 Python
python 统计代码行数简单实例
May 04 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
python2.7安装图文教程
Mar 13 Python
遗传算法python版
Mar 19 Python
python中in在list和dict中查找效率的对比分析
May 04 Python
利用pytorch实现对CIFAR-10数据集的分类
Jan 14 Python
Jupyter加载文件的实现方法
Apr 14 Python
利用python进行文件操作
Dec 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
ThinkPHP的L方法使用简介
2014/06/18 PHP
php 判断字符串编码是utf-8 或gb2312实例
2016/11/01 PHP
js出生日期 年月日级联菜单示例代码
2014/01/10 Javascript
jquery插件开发之实现jquery手风琴功能分享
2014/03/10 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
使用js复制链接中的部分文字的方法
2015/07/30 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
微信小程序 详解页面跳转与返回并回传数据
2017/02/13 Javascript
使用yeoman构建angular应用的方法
2017/08/14 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
[01:02:02]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第二局
2016/02/25 DOTA
Python版的文曲星猜数字游戏代码
2013/09/02 Python
Python文件处理
2016/02/29 Python
python二分查找算法的递归实现方法
2016/05/12 Python
python数据类型_元组、字典常用操作方法(介绍)
2017/05/30 Python
Go/Python/Erlang编程语言对比分析及示例代码
2018/04/23 Python
python把数组中的数字每行打印3个并保存在文档中的方法
2018/07/17 Python
Python 将json序列化后的字符串转换成字典(推荐)
2020/01/06 Python
tensorflow 重置/清除计算图的实现
2020/01/19 Python
windows下Pycharm安装opencv的多种方法
2020/03/05 Python
keras实现多种分类网络的方式
2020/06/11 Python
keras读取训练好的模型参数并把参数赋值给其它模型详解
2020/06/15 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
加拿大拼图大师:Puzzle Master
2020/12/28 全球购物
你经历的项目中的SCM配置项主要有哪些?什么是配置项?
2013/11/04 面试题
工商技校毕业生自荐信
2013/11/15 职场文书
高中体育教学反思
2014/01/24 职场文书
个人承诺书格式
2014/06/03 职场文书
年度评优评先方案
2014/06/03 职场文书
企业安全生产月活动总结
2014/07/05 职场文书
银行竞聘报告范文
2014/11/06 职场文书
2014年药店工作总结
2014/11/20 职场文书
优秀少先队辅导员事迹材料
2014/12/24 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书
就业证明函
2015/06/17 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang