Python Pandas知识点之缺失值处理详解


Posted in Python onMay 11, 2021

前言

数据处理过程中,经常会遇到数据有缺失值的情况,本文介绍如何用Pandas处理数据中的缺失值。

一、什么是缺失值

对数据而言,缺失值分为两种,一种是Pandas中的空值,另一种是自定义的缺失值。

1. Pandas中的空值有三个:np.nan (Not a Number) 、 None 和 pd.NaT(时间格式的空值,注意大小写不能错),这三个值可以用Pandas中的函数isnull(),notnull(),isna()进行判断。

Python Pandas知识点之缺失值处理详解

isnull()和notnull()的结果互为取反,isnull()和isna()的结果一样。对于这三个函数,只需要用其中一个就可以识别出数据中是否有空值。如果数据量较大,再配合numpy中的any()和all()函数就行了。

需要特别注意两点:

  • 如果某一列数据全是空值且包含pd.NaT,np.nan和None会自动转换成pd.NaT。
  • 空值(np.nan、None、pd.NaT)既不是空字符串"",也不是空格" "。

Python Pandas知识点之缺失值处理详解

从Python解释器来看,np.nan的类型是float,None的类型是NoneType,两者在Pandas中都显示为NaN,pd.NaT的类型是Pandas中的NaTType,显示为NaT。而不管是空字符串还是空格,其数据类型都是字符串,Pandas判断的结果不是空值。

2. 自定义缺失值有很多不同的形式,如上面刚说的空字符串和空格(当然,一般不用这两个,因为看起来不够直观)。

在获取数据时,可能会有一些数据无法得到,也可能数据本身就没有,造成了缺失值。对于这些缺失值,在获取数据时通常会用一些符号之类的数据来代替,如问号?,斜杠/,字母NA等。

如果处理的数据是自己获取的,那自己知道缺失值是怎么定义的,如果数据是其他人提供的,一般会同时提供数据的说明文档,说明文档中会注明缺失值的定义方式。

对于自定义缺失值,不能用isnull()等三个函数来判断,不过可以用isin()函数来判断。找到这些值后,将其替换成np.nan,数据就只有空值一种缺失值了。

此外,在数据处理的过程中,也可能产生缺失值,如除0计算,数字与空值计算等。

二、判断缺失值

1. 自定义缺失值的判断和替换

Python Pandas知识点之缺失值处理详解

isin(values): 判断Series或DataFrame中是否包含某些值,可以传入一个可迭代对象、Series、DataFrame或字典。在我们判断某个自定义的缺失值是否存在于数据中时,用列表的方式传入就可以了。

replace(to_replace=None, value=None): 替换Series或DataFrame中的指定值,一般传入两个参数,to_replace为被替换的值,value为替换后的值。to_replace和value不仅支持Python中的整型、字符串、列表、字典等,还支持正则表达式。

使用replace()时,默认返回原数据的一个副本,replace()中的inplace参数默认为False,将inplace参数修改为True,则会修改数据本身。其他参数这里就不展开了,有需要可以自己添加。

其实replace()函数已经可以用于缺失值的填充处理了,直接一步到位,而不用先替换成空值再处理。当然,先替换成空值,可以与空值一起处理。

2. 空值判断

Python Pandas知识点之缺失值处理详解

isnull(): 判断Series或DataFrame中是否包含空值,与isna()结果相同,与notnull()结果相反。返回结果是一个与原数据形状相同的Series或DataFrame。

如果数据很多,我们不可能肉眼观察返回结果中的布尔值,所以需要借助numpy中的any()函数或all()函数,进一步对结果进行判断。

三、删除缺失值

Python Pandas知识点之缺失值处理详解

dropna(axis=0, how="any", thresh=None, subset=None, inplace=False): 删除Series或DataFrame中的空值。

Python Pandas知识点之缺失值处理详解

axis: axis参数默认为0('index'),按行删除,即删除有空值的行。将axis参数修改为1或‘columns',则按列删除,即删除有空值的列。在实际的应用中,一般不会按列删除,例如数据中的一列表示年龄,不能因为年龄有缺失值而删除所有年龄数据。

Python Pandas知识点之缺失值处理详解

how: how参数默认为any,只要一行(或列)数据中有空值就会删除该行(或列)。将how参数修改为all,则只有一行(或列)数据中全部都是空值才会删除该行(或列)。

Python Pandas知识点之缺失值处理详解

thresh: 表示删除空值的界限,传入一个整数。如果一行(或列)数据中少于thresh个非空值(non-NA values),则删除。​也就是说,一行(或列)数据中至少要有thresh个非空值,否则删除。

Python Pandas知识点之缺失值处理详解

subset: 删除空值时,只判断subset指定的列(或行)的子集,其他列(或行)中的空值忽略,不处理。当按行进行删除时,subset设置成列的子集,反之。

inplace: 默认为False,返回原数据的一个副本。将inplace参数修改为True,则会修改数据本身。

删除缺失值,必然会导致数据量的减少,如果缺失值占数据的比例较大,比如超过了数据的10%(具体标准根据项目来定),删除数据对数据分析的结果会有很大的影响,不合理。

四、填充缺失值

Python Pandas知识点之缺失值处理详解

fillna(value=None, method=None, axis=None, inplace=False, limit=None): 填充Series或DataFrame中的空值。

value: 表示填充的值,可以是一个指定值,也可以是字典, Series或DataFrame。

Python Pandas知识点之缺失值处理详解

method: 填充的方式,默认为None。有 ffill,pad,bfill,backfill 四种填充方式可以使用,ffill 和 pad 表示用缺失值的前一个值填充,如果axis=0,则用空值上一行的值填充,如果axis=1,则用空值左边的值填充。假如空值在第一行或第一列,以及空值前面的值全都是空值,则无法获取到可用的填充值,填充后依然保持空值。bfill 和 backfill 表示用缺失值的后一个值填充,axis的用法以及找不到填充值的情况同 ffill 和 pad 。

注意:当指定填充方式method时,不能同时指定填充值value,否则报错。

axis: 通常配合method参数使用,axis=0表示按行,axis=1表示按列。

Python Pandas知识点之缺失值处理详解

limit: 表示填充执行的次数。如果是按行填充,则填充一行表示执行一次,按列同理。

Python Pandas知识点之缺失值处理详解

在缺失值填充时,填充值是自定义的,对于数值型数据,最常用的两种填充值是用该列的均值和众数。DataFrame的众数也是一个DataFrame数据,众数可能有多个(极限情况下,当数据中没有重复值时,众数就是原DataFrame本身),所以用mode()函数求众数时取第一行用于填充就行了。

Python Pandas知识点之缺失值处理详解

除了可以在fillna()函数中传入method参数指定填充方式外,Pandas中也实现了不同填充方式的函数,可以直接调用。

pad(axis=0, inplace=False, limit=None): 用缺失值的前一个值填充。

ffill(): 同pad()。

bfill(): 用缺失值的后一个值填充。

backfill(): 同bfill()。

在进行数据填充时,可能填充之后还有空值,如用ffill 和 pad填充时,数据第一行就是空值。对于这种情况,需要在填充前人工进行判断,避免选择不适合的填充方式,并在填充完成后,再检查一次数据中是否还有空值。

总结

到此这篇关于Python Pandas知识点之缺失值处理的文章就介绍到这了,更多相关Pandas缺失值处理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Ubuntu下创建虚拟独立的Python环境全过程
Feb 10 Python
python中pylint使用方法(pylint代码检查)
Apr 06 Python
Python unittest单元测试框架总结
Sep 08 Python
利用python实现对web服务器的目录探测的方法
Feb 26 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
Apr 03 Python
PyTorch基本数据类型(一)
May 22 Python
Python实现FM算法解析
Jun 18 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
Python单例模式的四种创建方式实例解析
Mar 04 Python
自己搭建resnet18网络并加载torchvision自带权重的操作
May 13 Python
python实现MD5进行文件去重的示例代码
Jul 09 Python
Pytorch实现图像识别之数字识别(附详细注释)
浅谈Python基础之列表那些事儿
详解Python牛顿插值法
Python中使用subprocess库创建附加进程
有趣的二维码:使用MyQR和qrcode来制作二维码
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 #Python
Python批量将csv文件转化成xml文件的实例
You might like
基于mysql的论坛(4)
2006/10/09 PHP
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
2014/04/29 PHP
phpmyadmin配置文件现在需要绝密的短密码(blowfish_secret)的2种解决方法
2014/05/07 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
2018/06/06 PHP
QUnit jQuery的TDD框架
2010/11/04 Javascript
纯js实现背景图片切换效果代码
2010/11/14 Javascript
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
javascript中的delete使用详解
2013/04/11 Javascript
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
js图片闪动特效可以控制间隔时间如几分钟闪动一下
2014/08/12 Javascript
jquery实现动态画圆
2014/12/04 Javascript
js实现ifram取父窗口URL地址的方法
2015/02/09 Javascript
JS获得图片alt信息的方法
2015/04/01 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
AngularJs中 ng-repeat指令中实现含有自定义指令的动态html的方法
2017/01/19 Javascript
JS实现图片转换成base64的各种应用场景实例分析
2018/06/22 Javascript
Vue+Mock.js模拟登录和表格的增删改查功能
2018/07/26 Javascript
react同构实践之实现自己的同构模板
2019/03/13 Javascript
解决vue init webpack 下载依赖卡住不动的问题
2020/11/09 Javascript
python安装numpy和pandas的方法步骤
2019/05/27 Python
使用Python和OpenCV检测图像中的物体并将物体裁剪下来
2019/10/30 Python
python matplotlib imshow热图坐标替换/映射实例
2020/03/14 Python
中国综合性网上购物商城:当当(网上卖书起家)
2016/11/16 全球购物
法国在线购买汽车轮胎网站:123pneus.fr
2019/02/25 全球购物
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
python re模块和正则表达式
2021/03/24 Python
高校教师个人工作总结2014
2014/12/17 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
使用springboot暴露oracle数据接口的问题
2021/05/07 Oracle
mysql 乱码 字符集latin1转UTF8
2022/04/19 MySQL