使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())

最近在做数据处理的时候,遇到个让我欲仙欲死的问题,那就是数据中的空值该如何获取。

Posted in Python onMay 14, 2021

我的目的本来是获取数据中的所有非零且非空值,然后再计算获得到的所有数据计算均值,再用均值把0和空值填上。这个操作让我意识到了i is None/np.isnan(i)/i.isnull()之间的差别,再此做简单介绍:

1.关于np.nan:

先明确一个问题,即空值的产生只有np.nan()一种方法。

# np.nan()的一些奇妙性质:
 
np.nan == np.nan
>>> False
 
np.isnan(np.nan)
>>> True
 
np.nan is None
>>> False
 
type(np.nan)
>>> float

总结一下:

np.nan不是一个“空”对象,用 i is None判断是False;

对某个值是否为空值进行判断,只能用np.isnan(i)函数,万万不可用 i == np.nan()来做,否则你会死的很惨的,因为空值并不能用判断相等的“==”正确识别(上例前两条);

np.nan非空对象,其类型为基本数据类型float(是不是很神奇,我也不知道为什么要这样设计)

2.np.isnan()和pd.isnull()何时使用:

# 首先创建一个DataFrame:
bb = pd.DataFrame({'a':[0,1,2,np.nan]})
bb
 
>>>     a
    0 0.0
    1 1.0
    2 2.0
    3 NaN
 
# 先测试一下np.isnan()
np.isnan(bb)
>>>     a
    0 False
    1 False
    2 False
    3 True
# 值得一提的是,如果想获悉整个DataFrame有无空值,可以在此基础上这样做:
 
np.isnan(bb).all()
>>> a    False
    dtype: bool          # 这行是指返回值的dtype
 
# 再测试一下isnull()
pd.isnull(bb)
>>>     a
    0 False
    1 False
    2 False
    3 True

由上可见,其实np.isnan()和pd.isnull()都可以对不论是DataFrame、Python list还是仅仅一个数值进行空值检测。但一般在实际应用中,np.isnan()多用于单个值的检验,pd.isnull()用于对一个DataFrame或Series(整体)的检验。

此外,根据pandas官方文档和源代码,pandas提供的另一个函数pd.isna()与pd.isnull()完全一样。

上面提到的any()/all()函数,请见pandas文档:

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.all.html#pandas.DataFrame.all

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.any.html#pandas.DataFrame.any

其他与空值检测或删除相关的函数还有:notna()、fillna()、dropna()等等。实战中应灵活使用。

补充:numpy中的nan(判断一个元素等于nan, 及nan安全函数 )

Nunpy中的NaN

多种方式创建nan(空值)

import numpy as np
np.nan
nan
np.NaN
nan
np.NAN
nan

判断是否存在空值

x = np.array([1, 1, 8, np.nan, 10])
np.nan in x

False
np.isin(np.nan, x)
array(False)
1 in x
True
np.isin(1, x)
array(True)
np.isnan(x)
array([False, False, False,  True, False])
x[-2] == np.nan, np.isnan(x[-2])
(False, True)

在np中nan需要用isnan这个函数来识别,还要注意:

x
array([ 1.,  1.,  8., nan, 10.])

x 中所有的元素都变成了浮点型,这是因为nan是浮点型的。

nan安全函数

np.mean(x)
nan
np.nanmean(x)
5.0

此外max, min, median等都是默认非nan安全的,需要加上nan来标记nan安全。

ps:pandas中是默认nan安全的。

补充:Python 处理DataFrame数据 pd.isnull() np.isnan()的方式

数据处理时,经常会遇到处理数据中的空值,涉及几个常用函数,pd.isnull(),pd.notnull(),np.isnan(),pd.notna(),pd.isna(),pd.fillna()、pd.dropna()等等.

本文关注pd.isnull(),pd.notnull(),np.isnan(),pd.notna(),pd.isna()。

总结:

由下可知,np.isnan()和pd.isnull()都可以对不论是DataFrame、Python list还是仅仅一个数值进行空值检测。但一般在实际应用中,np.isnan()多用于单个值的检验,pd.isnull()用于对一个DataFrame或Series(整体)的检验。

1.pd.isnull()

pd.isnull()可以对不论是DataFrame、Python list还是仅仅一个数值进行空值检测。但一般在实际应用中,pd.isnull()用于对一个DataFrame或Series(整体)的检验。

此外,根据pandas官方文档和源代码,pandas提供的另一个函数pd.isna()与pd.isnull()完全一样。

# 首先创建一个DataFrame:
df = pd.DataFrame({'a':[0,1,2,np.nan]})
df
 
>>>     a
    0 0.0
    1 1.0
    2 2.0
    3 NaN
 
# 测试isnull()
pd.isnull(df)
>>>     a
    0 False
    1 False
    2 False
    3 True
 
# 测试isna()
pd.isna(df)
>>>     a
    0 False
    1 False
    2 False
    3 True
 
# 测试notnull()
pd.notnull(df)
>>>     a
    0 True
    1 True
    2 True
    3 False
 
# 测试notna()
pd.notna(df)
>>>     a
    0 True
    1 True
    2 True
    3 False

2.np.nan()

判断是否为np.nan()。

np.nan不是一个“空”对象,对某个值是否为空值进行判断,只能用np.isnan(i)函数。

np.nan非空对象,其类型为基本数据类型float。

np.nan()可以对不论是DataFrame、Python list还是仅仅一个数值进行空值检测。但一般在实际应用中,np.nan()多用于单个值的检验。

np.nan == np.nan
>>> False
 
np.isnan(np.nan)
>>> True
 
type(np.nan)
>>> float
 
np.nan is None
>>> False
 
np.isnan(df)
>>>     a
    0 False
    1 False
    2 False
    3 True

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python获取指定路径下所有指定后缀文件的方法
May 26 Python
ubuntu16.04制作vim和python3的开发环境
Sep 23 Python
python读取几个G的csv文件方法
Jan 07 Python
Django框架模板的使用方法示例
May 25 Python
详解pytorch 0.4.0迁移指南
Jun 16 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
Jul 07 Python
对于Python深浅拷贝的理解
Jul 29 Python
Django中从mysql数据库中获取数据传到echarts方式
Apr 07 Python
python使用OpenCV模块实现图像的融合示例代码
Apr 10 Python
Python文件操作模拟用户登陆代码实例
Jun 09 Python
Python实现JS解密并爬取某音漫客网站
Oct 23 Python
Python面向对象编程之类的概念
Nov 01 Python
PyQt5爬取12306车票信息程序的实现
python flask框架快速入门
如何将numpy二维数组中的np.nan值替换为指定的值
May 14 #Python
使用numpy nonzero 找出非0元素
May 14 #Python
Python机器学习之KNN近邻算法
May 14 #Python
Python爬虫基础讲解之请求
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 #Python
You might like
PHP中实现图片的锐化
2006/10/09 PHP
一步一步学习PHP(6) 面向对象
2010/02/16 PHP
写了一个layout,拖动条连贯,内容区可为iframe
2007/08/19 Javascript
学习ExtJS border布局
2009/10/08 Javascript
jQuery-Easyui 1.2 实现多层菜单效果的代码
2012/01/13 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
浅析offsetLeft,Left,clientLeft之间的区别
2013/11/30 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
JavaScript子窗口调用父窗口变量和函数的方法
2015/10/09 Javascript
js倒计时显示实例
2016/12/11 Javascript
javascript ASCII和Hex互转的实现方法
2016/12/27 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
2017/02/06 Javascript
js实现控制文件拖拽并获取拖拽内容功能
2018/02/17 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
小程序如何构建骨架屏
2019/05/29 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
[03:31]DOTA2英雄基础教程 大地之灵
2013/12/17 DOTA
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
python3 爬取图片的实例代码
2018/11/06 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
工厂厂长的职责
2013/12/12 职场文书
什么样的创业计划书可行性高?
2014/02/01 职场文书
护校行动方案
2014/05/31 职场文书
法人委托书范本
2014/09/15 职场文书
企业承诺书格式范文
2015/04/28 职场文书
表扬信范文
2019/04/22 职场文书
导游词之江南周庄
2019/12/06 职场文书
OpenCV-Python 实现两张图片自动拼接成全景图
2021/06/11 Python
利用Pycharm连接服务器的全过程记录
2021/07/01 Python