pandas如何处理缺失值


Posted in Python onJuly 31, 2019

在实际应用中对于数据进行分析的时候,经常能看见缺失值,下面来介绍一下如何利用pandas来处理缺失值。常见的缺失值处理方式有,过滤、填充。

一、缺失值的判断

pandas使用浮点值NaN(Not a Number)表示浮点数和非浮点数组中的缺失值,同时python内置None值也会被当作是缺失值。

a、Series的缺失值判断

s = Series(["a","b",np.nan,"c",None])
  print(s)
  '''
  0    a
  1    b
  2   NaN
  3    c
  4  None
  '''
  #判断缺失值,如果是则返回True,否则返回False
  print(s.isnull())
  '''
  0  False
  1  False
  2   True
  3  False
  4   True
  '''
  #输出缺失值的索引和值
  print(s[s.isnull()])
  '''
  2   NaN
  4  None
  '''

b、DataFrame的缺失值判断

a = [[1,np.nan,2],[3,4,None]]
  data = DataFrame(a)
  #DataFrame的None值变成了NaN
  print(data)
  '''
    0  1  2
  0 1 NaN 2.0
  1 3 4.0 NaN
  '''
  print(data.isnull())
  '''
      0   1   2
  0 False  True False
  1 False False  True
  '''
  print(data[data.isnull()])
  '''
    0  1  2
  0 NaN NaN NaN
  1 NaN NaN NaN
  '''

注意:在使用Series和DataFrame的时候,如果其中有值为None,Series会输出None,而DataFrame会输出NaN,但是对空值判断没有影响。DataFrame使用isnull方法在输出空值的时候全为NaN,因为DataFrame对于False对应的位置,输出值会使用NaN代替,而Series对于Fasel对应的位置是没有输出值的。

二、过滤缺失数据

a、Series的缺失值过滤

s = Series(["a","b",np.nan,"c",None])
  #通过使用notnull方法来获取非缺失数据
  print(s[s.notnull()])
  '''
  0  a
  1  b
  3  c
  '''
  #使用dropna方法删除缺失数据,返回一个删除后的Series
  print(s.dropna())
  '''
  0  a
  1  b
  3  c
  '''
  #并没有在原来的Series上进行直接删除
  print(s)
  '''
  0    a
  1    b
  2   NaN
  3    c
  4  None
  '''
  #通过设置inplace参数为True,在原Series上进行删除,不会返回Series
  print(s.dropna(inplace=True))
  #None
  print(s)
  '''
  0  a
  1  b
  3  c
  '''

b、DataFrame的缺失值过滤

DataFrame删除缺失值相对于Series而言就要复杂一些,也许有的时候你是想删除含有缺失值的行或列,也许有时候你需要删除的是,当整行或整列全为缺失值的时候才删除,好在pandas对于这两种情况都有相对应的处理方法。

1、删除含有缺失值的行和列

a = [[1, np.nan, 2],[9,None,np.nan],[3, 4, None],[5,6,7]]
  data = DataFrame(a)
  print(data)
  '''
    0  1  2
  0 1 NaN 2.0
  1 9 NaN NaN
  2 3 4.0 NaN
  3 5 6.0 7.0 
  '''
  #使用dropna方法删除含有缺失值的行,默认是行
  print(data.dropna())
  '''
    0  1  2
  3 5 6.0 7.0
  '''
  #删除含有缺失值的列
  print(data.dropna(axis=1))
  '''
    0
  0 1
  1 9
  2 3
  3 5
  '''

2、删除全为NaN的行和列

a = [[1, np.nan, 2],[np.nan,None,np.nan],[3, None, None],[5,None,7]]
  data = DataFrame(a)
  print(data)
  '''
     0  1  2
  0 1.0 NaN 2.0
  1 NaN NaN NaN
  2 3.0 NaN NaN
  3 5.0 NaN 7.0
  '''
  #当行全为NaN的时候,才删除,参数how默认是any,含有缺失值就删除
  print(data.dropna(how="all"))
  '''
     0  1  2
  0 1.0 NaN 2.0
  2 3.0 NaN NaN
  3 5.0 NaN 7.0
  '''
  #当列全为NaN的时候,才删除
  print(data.dropna(how="all",axis=1))
  '''
     0  2
  0 1.0 2.0
  1 NaN NaN
  2 3.0 NaN
  3 5.0 7.0
  '''

dropna方法的inplace的设置与Series一样。

3、指定删除数据后显示部分数据观察

a = [[1, np.nan, 2],[np.nan,None,np.nan],[3, None, None],[5,None,7]]
  data = DataFrame(a)
  print(data)
  '''
     0  1  2
  0 1.0 NaN 2.0
  1 NaN NaN NaN
  2 3.0 NaN NaN
  3 5.0 NaN 7.0
  '''
  #当行全为NaN的时候,才删除,参数how默认是any,含有缺失值就删除
  print(data.dropna(how="all"))
  '''
     0  1  2
  0 1.0 NaN 2.0
  2 3.0 NaN NaN
  3 5.0 NaN 7.0
  '''
  #通过thresh参数来控制显示删除数据的条数,删除列的时候thresh参数无效
  print(data.dropna(how="all",thresh=2))
  '''
     0  1  2
  0 1.0 NaN 2.0
  3 5.0 NaN 7.0
  '''

三、填充缺失值

数据都是宝贵的,也许有时候你的数据不够多,因为数据越多对于模型的训练,数据分析都是有好处的,所以很多的时候我们都不想删除数据。通常情况下,也许你会选择用一些特殊值来填充缺失值。下面介绍使用pandas的fillna方法来填充缺失数据。

1、指定特殊值填充缺失值

a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
  data = DataFrame(a)
  print(data)
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 NaN 6.0
  2 3 7.0 NaN
  3 5 NaN 7.0
  '''
  #用0填充所有的缺失数据
  print(data.fillna(0))
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 0.0 6.0
  2 3 7.0 0.0
  3 5 0.0 7.0
  '''

2、不同列使用不同的填充值

a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
  data = DataFrame(a)
  print(data)
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 NaN 6.0
  2 3 7.0 NaN
  3 5 NaN 7.0
  '''
  print(data.fillna({1:1,2:2}))
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 1.0 6.0
  2 3 7.0 2.0
  3 5 1.0 7.0
  '''

3、前向填充和后向填充

a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
  data = DataFrame(a)
  print(data)
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 NaN 6.0
  2 3 7.0 NaN
  3 5 NaN 7.0
  '''
  #前向填充,使用默认是上一行的值,设置axis=1可以使用列进行填充
  print(data.fillna(method="ffill"))
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 2.0 6.0
  2 3 7.0 6.0
  3 5 7.0 7.0
  '''
  #后向填充,使用下一行的值,不存在的时候就不填充
  print(data.fillna(method="bfill"))
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 7.0 6.0
  2 3 7.0 7.0
  3 5 NaN 7.0
  '''

4、使用列的平均值进行填充

a = [[1, 2, 2],[3,None,6],[3, 7, None],[5,None,7]]
  data = DataFrame(a)
  print(data)
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 NaN 6.0
  2 3 7.0 NaN
  3 5 NaN 7.0
  '''
  print(data.fillna(data.mean()))
  '''
    0  1  2
  0 1 2.0 2.0
  1 3 4.5 6.0
  2 3 7.0 5.0
  3 5 4.5 7.0
  '''

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python pass 语句使用示例
Mar 11 Python
python基于multiprocessing的多进程创建方法
Jun 04 Python
python 信息同时输出到控制台与文件的实例讲解
May 11 Python
TensorFlow 滑动平均的示例代码
Jun 19 Python
python得到windows自启动列表的方法
Oct 14 Python
Python Series从0开始索引的方法
Nov 06 Python
pycharm配置pyqt5-tools开发环境的方法步骤
Feb 11 Python
Django项目使用CircleCI的方法示例
Jul 14 Python
Python使用scrapy爬取阳光热线问政平台过程解析
Aug 14 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
Apr 24 Python
python GUI计算器的实现
Oct 09 Python
python中urllib包的网络请求教程
Apr 19 Python
详细介绍pandas的DataFrame的append方法使用
Jul 31 #Python
使用pandas读取文件的实现
Jul 31 #Python
python3实现mysql导出excel的方法
Jul 31 #Python
Django接收post前端返回的json格式数据代码实现
Jul 31 #Python
python快速编写单行注释多行注释的方法
Jul 31 #Python
使用 Django Highcharts 实现数据可视化过程解析
Jul 31 #Python
利用Python检测URL状态
Jul 31 #Python
You might like
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
深入php define()函数以及defined()函数的用法详解
2013/06/05 PHP
Windows中使用计划任务自动执行PHP程序实例
2014/05/09 PHP
简单解决新浪SAE无法上传文件的问题
2015/05/13 PHP
php将服务端的文件读出来显示在web页面实例
2016/10/31 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
jquery 上下滚动广告
2009/06/17 Javascript
JavaScript 比较时间大小的代码
2010/04/24 Javascript
jQuery 学习第五课 Ajax 使用说明
2010/05/17 Javascript
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
JavaScript 学习笔记之语句
2015/01/14 Javascript
JS+CSS实现的拖动分页效果实例
2015/05/11 Javascript
Jquery中使用show()与hide()方法动画显示和隐藏图片
2015/10/08 Javascript
jQuery简单实现彩色云标签效果示例
2016/08/01 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
2016/10/12 Javascript
jquery中用jsonp实现搜索框功能
2016/10/18 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
详解创建自定义的Angular Schematics
2018/06/06 Javascript
JavaScript fetch接口案例解析
2018/08/30 Javascript
[45:46]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS DT
2014/05/23 DOTA
[03:08]Ti4观战指南上
2014/07/07 DOTA
使用python加密自己的密码
2015/08/04 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
Python + opencv对拍照得到的图片进行背景去除的实现方法
2020/11/18 Python
HTML5标签小集
2011/08/02 HTML / CSS
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
平安工地建设方案
2014/05/06 职场文书
保险专业求职信
2014/07/07 职场文书
小学生放飞梦想演讲稿
2014/08/26 职场文书
标准离婚协议书范文下载
2014/11/30 职场文书
中学社团活动总结
2015/05/07 职场文书
少年派的奇幻漂流观后感
2015/06/08 职场文书