使用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 执行字符串表达式函数(eval exec execfile)
Aug 11 Python
Python多线程实例教程
Sep 06 Python
用Python实现通过哈希算法检测图片重复的教程
Apr 02 Python
Python实现二分查找算法实例
May 26 Python
Python中pip安装非PyPI官网第三方库的方法
Jun 02 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
pytorch实现seq2seq时对loss进行mask的方式
Feb 18 Python
python图片剪裁代码(图片按四个点坐标剪裁)
Mar 10 Python
Python模拟伯努利试验和二项分布代码实例
May 27 Python
Python flask框架端口失效解决方案
Jun 04 Python
python matplotlib库的基本使用
Sep 23 Python
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 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
8个必备的PHP功能开发
2015/10/02 PHP
php nginx 实时输出的简单实现方法
2018/01/21 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
php新建文件的方法实例
2019/09/26 PHP
laravel Model 执行事务的实现
2019/10/10 PHP
JavaScript CSS修改学习第五章 给“上传”添加样式
2010/02/19 Javascript
js几个验证函数代码
2010/03/25 Javascript
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
JS获取浏览器版本及名称实现函数
2013/04/02 Javascript
JS 对输入框进行限制(常用的都有)
2013/07/30 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
浅析JavaScript访问对象属性和方法及区别
2015/11/16 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
2015/12/04 Javascript
JavaScript事件代理和委托详解
2016/04/08 Javascript
JS封装的自动创建表格的实现代码
2016/06/15 Javascript
vue基于Vue2.0和高德地图的地图组件实例
2017/04/28 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
vuejs前后端数据交互之从后端请求数据的实例
2018/08/11 Javascript
vue 中滚动条始终定位在底部的方法
2018/09/03 Javascript
js计算两个日期间的天数月的实例代码
2018/09/20 Javascript
node.js学习笔记之koa框架和简单爬虫练习
2018/12/13 Javascript
JavaScript模板引擎原理与用法详解
2018/12/24 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
Python按行读取文件的简单实现方法
2016/06/22 Python
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
python文本数据相似度的度量
2018/03/12 Python
Python实现决策树C4.5算法的示例
2018/05/30 Python
Python 中的range(),以及列表切片方法
2018/07/02 Python
Python使用爬虫抓取美女图片并保存到本地的方法【测试可用】
2018/08/30 Python
python安装本地whl的实例步骤
2019/10/12 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
150行python代码实现贪吃蛇游戏
2020/04/24 Python
运动会通讯稿400字
2014/01/28 职场文书
团员自我评价范文
2015/03/10 职场文书
2015年服务员工作总结
2015/04/08 职场文书
python生成随机数、随机字符、随机字符串
2021/04/06 Python