使用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 相关文章推荐
用生成器来改写直接返回列表的函数方法
May 25 Python
Python 获得命令行参数的方法(推荐)
Jan 24 Python
Python利用公共键如何对字典列表进行排序详解
May 19 Python
python 获取页面表格数据存放到csv中的方法
Dec 26 Python
浅谈Python爬虫基本套路
Mar 25 Python
Python企业编码生成系统之主程序模块设计详解
Jul 26 Python
pytorch numpy list类型之间的相互转换实例
Aug 18 Python
解决django FileFIELD的编码问题
Mar 30 Python
Keras SGD 随机梯度下降优化器参数设置方式
Jun 19 Python
python 如何使用find和find_all爬虫、找文本的实现
Oct 16 Python
Python数据模型与Python对象模型的相关总结
Jan 26 Python
Django开发RESTful API实现增删改查(入门级)
May 10 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外部执行命令函数用法小结
2016/10/11 PHP
Laravel 5.5 实现禁用用户注册示例
2019/10/24 PHP
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
jQuery+ajax中getJSON() 用法实例
2014/12/22 Javascript
js实现索引图片切换效果
2015/11/21 Javascript
Bootstrap每天必学之滚动监听
2016/03/16 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
weex slider实现滑动底部导航功能
2017/08/28 Javascript
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
[02:32]DOTA2英雄基础教程 美杜莎
2014/01/07 DOTA
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
零基础写python爬虫之爬虫的定义及URL构成
2014/11/04 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
python正则中最短匹配实现代码
2018/01/16 Python
详解Python解决抓取内容乱码问题(decode和encode解码)
2019/03/29 Python
Python多版本开发环境管理工具介绍
2019/07/03 Python
python自带tkinter库实现棋盘覆盖图形界面
2019/07/17 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
celery在python爬虫中定时操作实例讲解
2020/11/27 Python
使用python将微信image下.dat文件解密为.png的方法
2020/11/30 Python
国际性能运动服装品牌:Dare 2b
2018/07/27 全球购物
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
若干个Java基础面试题
2015/05/19 面试题
2014端午节活动策划方案
2014/01/27 职场文书
法律六进活动方案
2014/03/13 职场文书
副乡长民主生活会个人对照检查材料思想汇报
2014/10/01 职场文书
委托函范文
2015/01/29 职场文书
golang goroutine顺序输出方式
2021/04/29 Golang
Python基础之常用库常用方法整理
2021/04/30 Python
Python提取PDF指定内容并生成新文件
2021/06/09 Python
python数字图像处理之图像的批量处理
2022/06/28 Python