如何将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中列表和元祖的使用方法
Apr 25 Python
Python利用IPython提高开发效率
Aug 10 Python
Python实现随机生成有效手机号码及身份证功能示例
Jun 05 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
python中ASCII码和字符的转换方法
Jul 09 Python
详解python读取和输出到txt
Mar 29 Python
在Python中实现函数重载的示例代码
Dec 12 Python
Python中socket网络通信是干嘛的
May 27 Python
Python如何读取、写入CSV数据
Jul 28 Python
用python写爬虫简单吗
Jul 28 Python
Python接口自动化测试的实现
Aug 28 Python
Python大批量搜索引擎图像爬虫工具详解
Nov 16 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数据文件缓存类汇总
2014/12/05 PHP
PHP file_get_contents函数读取远程数据超时的解决方法
2015/05/13 PHP
thinkphp3.2.3版本的数据库增删改查实现代码
2016/09/22 PHP
php使用正则表达式获取字符串中的URL
2016/12/29 PHP
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
jQuery中delegate()方法用法实例
2015/01/19 Javascript
JQUERY简单按钮轮换选中效果实现方法
2015/05/07 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
jQuery validate验证插件使用详解
2016/05/11 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
基于zepto.js实现登录界面
2017/10/09 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
Vue全局分页组件的实现代码
2018/08/10 Javascript
Vue入门之数量加减运算操作示例
2018/12/11 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
python 生成目录树及显示文件大小的代码
2009/07/23 Python
深入理解Python中的*重复运算符
2017/10/28 Python
Python基础练习之用户登录实现代码分享
2017/11/08 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
详解Python:面向对象编程
2019/04/10 Python
python Pandas如何对数据集随机抽样
2019/07/29 Python
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
屈臣氏越南官网:Watsons越南
2021/01/14 全球购物
学校安全教育月活动总结
2014/07/07 职场文书
处级干部反四风个人对照检查材料思想汇报
2014/09/27 职场文书
处级领导干部四风问题自我剖析材料
2014/09/29 职场文书
清洁员岗位职责
2015/02/15 职场文书
2015年出纳年终工作总结
2015/05/14 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
2016新年年会主持词
2015/07/06 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL