如何将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单链表的简单实现方法
Sep 23 Python
在Mac OS上部署Nginx和FastCGI以及Flask框架的教程
May 02 Python
Python编写生成验证码的脚本的教程
May 04 Python
python删除列表元素的三种方法(remove,pop,del)
Jul 22 Python
Python如何向SQLServer存储二进制图片
Jun 08 Python
基于Python实现下载网易音乐代码实例
Aug 10 Python
python 装饰器的实际作用有哪些
Sep 07 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
Nov 24 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 Python
python 如何读、写、解析CSV文件
Mar 03 Python
python制作图形界面的2048游戏, 基于tkinter
Apr 06 Python
详解Golang如何实现支持随机删除元素的堆
Sep 23 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框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
PHP实现判断数组是一维、二维或几维的方法
2017/02/06 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
PHP获取ttf格式文件字体名的方法示例
2019/03/06 PHP
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
jQuery 1.9移除了$.browser可以使用$.support来替代
2014/09/03 Javascript
JavaScript中发布/订阅模式的简单实例
2014/11/05 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
解析NodeJs的调试方法
2016/12/11 NodeJs
纯js实现倒计时功能
2017/01/06 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
在Vue项目中使用d3.js的实例代码
2018/05/01 Javascript
微信小程序封装自定义弹窗的实现代码
2019/05/08 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
简介JavaScript错误处理机制
2020/08/04 Javascript
实现vuex原理的示例
2020/10/21 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
[49:59]KG vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python自动化测试工具Splinter简介和使用实例
2014/05/13 Python
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
Python爬虫抓取代理IP并检验可用性的实例
2018/05/07 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
使用Pyhton集合set()实现成果查漏的例子
2019/11/24 Python
python wxpython 实现界面跳转功能
2019/12/17 Python
python mysql中in参数化说明
2020/06/05 Python
美国购买汽车零件网站:Buy Auto Parts
2018/04/02 全球购物
SmartBuyGlasses意大利:购买太阳镜、眼镜和隐形眼镜
2018/11/20 全球购物
sort命令的作用和用法
2013/08/25 面试题
父亲的菜园教学反思
2014/02/13 职场文书
跳蚤市场口号
2014/06/13 职场文书
群众路线教育党员自我剖析材料
2014/10/06 职场文书
交警正风肃纪剖析材料
2014/10/29 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书
WIN10使用IIS部署ftp服务器详细教程
2022/08/05 Servers