如何将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启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)
Apr 09 Python
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
Nov 06 Python
python使用wmi模块获取windows下的系统信息 监控系统
Oct 27 Python
python实现分页效果
Oct 25 Python
python图像常规操作
Nov 11 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
Python实现批量执行同目录下的py文件方法
Jan 11 Python
Python 移动光标位置的方法
Jan 20 Python
Python搭建代理IP池实现接口设置与整体调度
Oct 27 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
Python xlrd excel文件操作代码实例
Mar 10 Python
Python3将ipa包中的文件按大小排序
Apr 17 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
Zerg基本策略
2020/03/14 星际争霸
不用数据库的多用户文件自由上传投票系统(1)
2006/10/09 PHP
超级简单的php+mysql留言本源码
2009/11/11 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
2010/06/09 PHP
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
2013/10/18 Javascript
Javascript之this关键字深入解析
2013/11/12 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
Node.js+ES6+dropload.js实现移动端下拉加载实例
2017/06/01 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
Vue render函数实战之实现tabs选项卡组件
2019/04/22 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
在vue-cli创建的项目中使用sass操作
2020/08/10 Javascript
Vue实现菜单切换功能
2020/11/08 Javascript
Python实现类似jQuery使用中的链式调用的示例
2016/06/16 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
2018/04/02 Python
Python使用jsonpath-rw模块处理Json对象操作示例
2018/07/31 Python
python tkinter界面居中显示的方法
2018/10/11 Python
windows7 32、64位下python爬虫框架scrapy环境的搭建方法
2018/11/29 Python
浅谈python标准库--functools.partial
2019/03/13 Python
tensorflow2.0的函数签名与图结构(推荐)
2020/04/28 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
Html5自定义字体解决方法
2019/10/09 HTML / CSS
空指针到底是什么
2012/08/07 面试题
J2EE中常用的名词进行解释
2015/11/09 面试题
称象教学反思
2014/02/03 职场文书
花坛标语大全
2014/06/30 职场文书
紫日观后感
2015/06/05 职场文书
董存瑞观后感
2015/06/11 职场文书
2016年校园重阳节广播稿
2015/12/18 职场文书
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript
python开发制作好看的时钟效果
2022/05/02 Python
详解如何使用Nginx解决跨域问题
2022/05/06 Servers
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android