使用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中for循环下的索引变量的作用域
Apr 15 Python
Python深入06——python的内存管理详解
Dec 07 Python
Android 兼容性问题:java.lang.UnsupportedOperationException解决办法
Mar 19 Python
Python编程生成随机用户名及密码的方法示例
May 05 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 Python
Python 函数list&read&seek详解
Aug 28 Python
pytorch sampler对数据进行采样的实现
Dec 31 Python
python 实现表情识别
Nov 21 Python
使用python操作lmdb对数据读取的实例
Dec 11 Python
pandas实现导出数据的四种方式
Dec 13 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 Python
详细介绍python类及类的用法
May 31 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采集文章中的图片获取替换到本地(实现代码)
2013/07/08 PHP
自定义session存储机制避免会话保持问题
2014/10/08 PHP
PHP中使用Imagick操作PSD文件实例
2015/01/26 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
jQuery 源代码显示控件 (Ajax加载方式).
2009/05/18 Javascript
解决js正则匹配换行问题实现代码
2012/12/10 Javascript
JQuery页面图片切换和新闻列表滚动效果的具体实现
2013/09/26 Javascript
JS画线(实例代码)
2013/11/20 Javascript
FireBug 调试JS入门教程 如何调试JS
2013/12/23 Javascript
js 判断控件获得焦点的示例代码
2014/03/04 Javascript
jquery使用ajax实现微信自动回复插件
2014/04/28 Javascript
js对象的复制继承实例
2015/01/10 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
javascript设置和获取cookie的方法实例详解
2016/01/05 Javascript
BetterScroll 在移动端滚动场景的应用
2017/09/18 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
js判断密码强度的方法
2020/03/18 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
vue 授权获取微信openId操作
2020/11/13 Javascript
python中yaml配置文件模块的使用详解
2018/04/27 Python
对python xlrd读取datetime类型数据的方法详解
2018/12/26 Python
Python Web程序搭建简单的Web服务器
2019/07/31 Python
关于python pycharm中输出的内容不全的解决办法
2020/01/10 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
曼城官方网上商店:Manchester City
2019/09/10 全球购物
个人求职简历的自我评价
2013/10/19 职场文书
写给女朋友的道歉信
2014/01/12 职场文书
祖国在我心中的演讲稿
2014/05/04 职场文书
大学迎新生标语
2014/10/06 职场文书
党员评议表自我评价范文
2014/10/20 职场文书
2014年幼儿园班级工作总结
2014/12/17 职场文书
2019暑假阅读倡议书
2019/06/24 职场文书
深入解析NumPy中的Broadcasting广播机制
2021/05/30 Python
python tqdm用法及实例详解
2021/06/16 Python