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发送SMTP邮件的教程
Apr 29 Python
Python heapq使用详解及实例代码
Jan 25 Python
使用Python中的tkinter模块作图的方法
Feb 07 Python
Python实现桶排序与快速排序算法结合应用示例
Nov 22 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
Python基于pandas爬取网页表格数据
May 11 Python
python 用pandas实现数据透视表功能
Dec 21 Python
使用OpenCV实现人脸图像卡通化的示例代码
Jan 15 Python
如何用Django处理gzip数据流
Jan 29 Python
Python集合set()使用的方法详解
Mar 18 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
德生S2000电路分析
2021/03/02 无线电
网络资源
2006/10/09 PHP
10条PHP编程习惯助你找工作
2008/09/29 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
动态添加js事件实现代码
2009/03/12 Javascript
javascript来定义类的规范小结
2010/11/19 Javascript
用JSON做数据传输格式中的一些问题总结
2011/12/21 Javascript
JS 页面计时器示例代码
2013/10/28 Javascript
JS文本获得焦点清除文本文字的示例代码
2014/01/13 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
详解addEventListener的三个参数之useCapture
2015/03/16 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
原生JS实现左右箭头选择日期实例代码
2017/03/14 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
JS实现数组去重,显示重复元素及个数的方法示例
2019/01/21 Javascript
websocket4.0+typescript 实现热更新的方法
2019/08/14 Javascript
layui对工具条进行选择性的显示方法
2019/09/19 Javascript
微信小程序自定义头部导航栏(组件化)
2019/11/15 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
[09:33]2015国际邀请赛第四日TOP10
2015/08/08 DOTA
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
Tensorflow环境搭建的方法步骤
2018/02/07 Python
Python多继承顺序实例分析
2018/05/26 Python
pthon贪吃蛇游戏详细代码
2019/01/27 Python
docker django无法访问redis容器的解决方法
2019/08/21 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
学雷锋志愿服务月活动总结
2014/03/09 职场文书
《富饶的西沙群岛》教学反思
2014/04/09 职场文书
运动会报道稿300字
2014/10/02 职场文书
优秀团员个人总结
2015/02/26 职场文书
党小组意见范文
2015/06/08 职场文书
JS前端监控采集用户行为的N种姿势
2022/07/23 Javascript