使用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实现批量转换文件编码(批转换编码示例)
Jan 23 Python
python Django模板的使用方法
Jan 14 Python
基于Django模板中的数字自增(详解)
Sep 05 Python
python 循环读取txt文档 并转换成csv的方法
Oct 26 Python
django主动抛出403异常的方法详解
Jan 04 Python
在python里从协程返回一个值的示例
Feb 19 Python
python队列Queue的详解
May 10 Python
如何关掉pycharm中的python console(图解)
Oct 31 Python
Python jieba库用法及实例解析
Nov 04 Python
Python使用正则实现计算字符串算式
Dec 29 Python
Django自关联实现多级联动查询实例
May 19 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 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
深入分析使用mysql_fetch_object()以对象的形式返回查询结果
2013/06/05 PHP
thinkphp autoload 命名空间自定义 namespace
2015/07/17 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
新浪刚打开页面出来的全屏广告代码
2007/04/02 Javascript
javascript 函数调用的对象和方法
2010/07/01 Javascript
javascript权威指南 学习笔记之javascript数据类型
2011/09/24 Javascript
js向上无缝滚动,网站公告效果 具体代码
2013/11/18 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
BootStrap Table 设置height表头与内容无法对齐的问题
2016/12/28 Javascript
javascript自执行函数
2017/02/10 Javascript
js轮播图透明度切换(带上下页和底部圆点切换)
2017/04/27 Javascript
详解Angular2响应式表单
2017/06/14 Javascript
简单实现js轮播图效果
2017/07/14 Javascript
Vue props用法详解(小结)
2018/07/03 Javascript
10种JavaScript最常见的错误(小结)
2019/06/21 Javascript
[46:23]OG vs EG 2018国际邀请赛淘汰赛BO3 第一场 8.23
2018/08/24 DOTA
python使用PyFetion来发送短信的例子
2014/04/22 Python
Python多进程同步Lock、Semaphore、Event实例
2014/11/21 Python
详解Python中heapq模块的用法
2016/06/28 Python
Python 移动光标位置的方法
2019/01/20 Python
Python从函数参数类型引出元组实例分析
2019/05/28 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
matplotlib基础绘图命令之imshow的使用
2020/08/13 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
优秀员工自荐书
2013/12/19 职场文书
致跳远、跳高运动员广播稿
2014/01/09 职场文书
小学安全教育材料
2014/02/17 职场文书
2015年教师党员公开承诺书
2015/01/22 职场文书
2015年社区创卫工作总结
2015/04/21 职场文书
关于做家务的心得体会
2016/01/23 职场文书
你真的了解PHP中的引用符号(&)吗
2021/05/12 PHP
python中mongodb包操作数据库
2022/04/19 Python