Pandas简明教程:七、Pandas缺失数据的处理(数据清洗基础)
文章目录
- 1、缺失数据的类型
- 2、定位缺失数据
- 3、修改定位数据
- 4、批量修改缺失数据
- 5、数据修复的利器--插值法(`interpolate`)
- 本系列教程教程完整目录:
数据清洗的内容其实很丰富,其中最基本的问题就是对一些缺失数据的处理。比如我们常会看到这样的表:
First Score | Second Score | Third Score | |
---|---|---|---|
0 | 100 | 30 | |
1 | 90 | 45 | 40 |
2 | 56 | 80 | |
3 | 95 | 98 |
在普遍的办公场景下(尤其是一些重要的表格),通常都有可能是有特殊的情况,那么此时都一定会去手动修改,甚至有时还会特别麻烦(比如银行的某些信息)。但我们在竞赛中,研究中,做项目的过程中对这些数据就可以自由一点,希望能利用经验知识等来对它们进行一定的处理。
本文就从这类问题入手讲解一下在Pandas中如何处理这些数据。
1、缺失数据的类型
据官方文档描述,由于在Python中None
就是默认的空值类型,因此它首先就会被当作缺失数据处理。
其次Nan
(not a number)也是常见的空值或者异常数据类型。
同时,官网说道:+-inf
也可以被视作缺失数据,此时需要加设一句:
pandas.options.mode.use_inf_as_na = True
比如上面的数据如果以逗号分隔存入csv
文件,再读取出来时是这样:
df = pd.read_csv(r".\test_nan.csv") # 数据存在该文件中dfUnnamed: 0 First Score Second Score Third Score
0 0 100.0 30.0 NaN
1 1 90.0 45.0 40.0
2 2 NaN 56.0 80.0
3 3 95.0 NaN 98.0
这里显示的第一列是Index
,第二列Unnamed:0
是由于这一个位置是空,于是被自动命名为"未命名"表头。而这里我们能清楚地看到,表中的空行已经被显示为NaN
。
不过要注意的是,此时如果
csv
文件中这些空值位置是空格或者Tab的话,它会被识别为’ ‘或者’ '。如果不明白就复制引号中的内容,再粘贴到word里面自然就清楚了。
2、定位缺失数据
Pandas中提供了判断表中数据是否为缺失数据的方法isnull
:
df.isnull()Unnamed: 0 First Score Second Score Third Score
0 False False False True
1 False False False False
2 False True False False
3 False False True False
这里可以看到,所有NaN
的位置全部变成了True
。但光是这样其实还远不够,尤其当数据量较大时,我们其实更想的是如果准确地定位这些数据,再想办法对其进行修改。
当然我们常规的思路是想直接定位到它的行列值上,这样就最方便,但Pandas并没有提供这样的一种方法,非常可惜。于是我们只能选择退而求其次的方案。
首先,我们可以先简单统计一下上哪些列有空值:
df.isnull().sum()Unnamed: 0 0
First Score 1Second Score 1Third Score 1
dtype: int64
这个原理就很简单了,由于df.isnull()
函数返回的表中每列全是Bool
类型,而sum()
是针对数值的操作,默认就将Ture
和False
转为1和0。那么对每列数据求和自然就统计出了缺失的数据总量。
其次,可以考虑直接从DataFrame
的值入手,获取缺失数据在其数据主体中所在的位置。
np.argwhere(np.isnan(df.values))array([[0, 3],[2, 1],[3, 2]], dtype=int64)%timeit np.argwhere(np.isnan(df.values))
53.8 µs ± 68.1 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
这里是借助Numpy中的定位函数,也比较简单,运行的时间也没有想象中那么慢。
此时返回的数组中,第一个元素就是行数,第二个元素就是列所在的位置(也从0开始),那么也很容易找到它们对应的列名:
for i,j in np.argwhere(np.isnan(df.values)):print('The',j,'th Column name:',df.iloc[:,j].name)The 3 th Column name: Third Score
The 1 th Column name: First Score
The 2 th Column name: Second Score
当然,还有更为高明的方法,可以参考Pandas缺失数据最快定位方式(极少代码快速实现,打死不用循环!!!)
3、修改定位数据
能够精准定位数据,自然也就可以对其进行修改了。最简单的方式自然是给出每个位置应有的值,比如:
df.iloc[2, 1] = 32
当然,这种方式与手动修改无异。我们想要看的是一些简单暴力而又常用的方法。
4、批量修改缺失数据
fillna()
比如我想将所有异常数据用一种夸张的形式填充:
df.fillna("!*#^@")Unnamed: 0 First Score Second Score Third Score
0 0 100 30 !*#^@
1 1 90 45 40
2 2 !*#^@ 56 80
3 3 95 !*#^@ 98
那么自然地,也可以用一些固定的数值来填充,比如:
df.fillna(-1)Unnamed: 0 First Score Second Score Third Score
0 0 100.0 30.0 -1.0
1 1 90.0 45.0 40.0
2 2 -1.0 56.0 80.0
3 3 95.0 -1.0 98.0
这里注意到,fillna()
中可以填充的类型是任意的,只要可以作为数据的东西都可以放进去,甚至包括Pandas的object. 这里就不再赘述,其实不用看官方文档也能很容易试出来。
- 用前或者后(同一列的上一行或下一行)的数据填充:
df.fillna(method='pad')
Out[154]: Unnamed: 0 First Score Second Score Third Score
0 0 100.0 30.0 NaN
1 1 90.0 45.0 40.0
2 2 90.0 56.0 80.0
3 3 95.0 56.0 98.0df.fillna(method='bfill')
Out[155]: Unnamed: 0 First Score Second Score Third Score
0 0 100.0 30.0 40.0
1 1 90.0 45.0 40.0
2 2 95.0 56.0 80.0
3 3 95.0 NaN 98.0
另外还可对填充次数进行限制,比如只允许填充一次:
df.fillna(method='bfill',limit=1)
这里由于每列数据只有一个空值,因此与上面的代码结果无异。
5、数据修复的利器–插值法(interpolate
)
可以看到上面缺失的数据都是数值,那么此时我们可以用插值的方式来处理,这种方式尤其在数据本身平稳并且量较充足的时候非常有用。同时也很自然地想到,这种操作对于我们参加数据挖掘竞赛非常有利!
df.interpolate(method='linear')Unnamed: 0 First Score Second Score Third Score
0 0 100.0 30.0 NaN
1 1 90.0 45.0 40.0
2 2 92.5 56.0 80.0
3 3 95.0 56.0 98.0
这里可以看到,多数空值都被填充了。它的原理是对现有的点进行线性插值,从而达到数据填充的目的。
另外,细心的同学应该也发现了,这里第一行最后一列数据并未被修改,这是因为默认的插值法是向前插值(即向下面的行进行插值),那么这里稍作修改即可:
df.interpolate(method='linear',limit_direction='backward')
Out[166]: Unnamed: 0 First Score Second Score Third Score
0 0 100.0 30.0 40.0
1 1 90.0 45.0 40.0
2 2 92.5 56.0 80.0
3 3 95.0 NaN 98.0
如果上下都想用,就用两次即可:
df.interpolate(method='linear',limit_direction='backward').interpolate(method='linear',limit_direction='forward')Unnamed: 0 First Score Second Score Third Score
0 0 100.0 30.0 40.0
1 1 90.0 45.0 40.0
2 2 92.5 56.0 80.0
3 3 95.0 56.0 98.0
注:Pandas在实现这类方法时实际上是调用的
scipy
的库,因此需要提前将scipy
装好。
当然,插值的方法有很多,目前该方法提供的选择如下:
- ‘linear’: 线性插值
- ‘index’, ‘values’: 用索引值直接填充.
- ‘nearest’, ‘zero’, ‘slinear’, ‘quadratic’, ‘cubic’, ‘spline’, ‘barycentric’, ‘polynomial’:
- 其中: ‘polynomial’ ,‘spline’ 需要设置阶数,如:
df.interpolate(method='polynomial', order=5)
.
- 其中: ‘polynomial’ ,‘spline’ 需要设置阶数,如:
- ‘krogh’, ‘piecewise_polynomial’, ‘spline’, ‘pchip’, ‘akima’: scipy中对应的方法(名称一致)
- ‘from_derivatives’: 采用方法
scipy.interpolate.BPoly.from_derivatives
关于上述所有方法的说明可以直接参考scipy
的文档或者用户说明。
本系列教程教程完整目录:
一、Pandas简介与安装
二、Pandas基本数据结构-DataFrame与Series
三、Pandas文件读写
四、Pandas数据索引方式
五、Pandas简单统计操作及通用方式
六、Pandas条件查询
七、Pandas缺失数据的处理(数据清洗基础)
八、Pandas数据透视表
九、表的合并、连接、拼接(数据聚合基础)
Pandas简明教程:七、Pandas缺失数据的处理(数据清洗基础)相关推荐
- 静态时序分析简明教程(七)]端口延迟
端口延迟 一.写在前面 1.1 快速导航链接· 二.端口延迟 2.1 输入有效 2.2 输出有效 2.3 set_input_delay 2.3.1 -clock clock_name 2.3.2 - ...
- Pandas简明教程:九、表的合并、连接、拼接(数据聚合基础)
真实场景中常会遇到多种信息放在不同的表里的情况,此时我们就需要将这些表格的信息整合到一起.这种操作可以极大地减轻我们手动粘数据的工作,从而达到事半功倍的效果. 由于本篇要举的例子较多,因此直接采用官网 ...
- Pandas简明教程:八、Pandas数据透视表
透视表(pivot)是由微软发明的一个概念,1993年微软注册了PivotTable这一商标,而他们又在2020年正式撤销了注册. 关于透视表的话题随便搜搜就是一大堆,而有些地方可能都吹得很神了.透视 ...
- Pandas简明教程:四、Pandas数据索引方式
文章目录 1.以类似`dict`的方式访问 2.以属性方式访问数据 3.访问行(slicing) 4.用`loc`方法访问不同行列 5.用`iloc`方法直接访问行列 6.其它方式 本系列教程教程完整 ...
- 系统重温Pandas笔记:(七)缺失数据
文章目录 写在前面 一.缺失值的统计和删除 1. 缺失信息的统计 2. 缺失信息的删除 二.缺失值的填充和插值 1. 利用fillna进行填充 [练一练] 2. 插值函数 三.Nullable类型 1 ...
- Pandas简明教程-适用于竞赛、研究以及办公自动化
数据的读.写.查.改是数据分析的基础,也是竞赛.研究以及办公自动化类项目的常用操作.为了让大家能以更简单的方法来操作数据,我们选择Pandas作为处理数据的工具,希望通过这个系列的教程能够帮助大家节省 ...
- Pandas简明教程:五、Pandas简单统计操作及通用方式
文章目录 1.DataFrame的方法使用举例 2.DataFrame的方法调用通用方式 3.DataFrame直接调用其它方法 本系列教程教程完整目录: 前面已经提到,Pandas的DataFram ...
- Pandas简明教程:六、Pandas条件查询
文章目录 1.基本方法 2.高级查询 3. 可用于修改内容的`where`方法 4.条件检索进阶:快速的查询方法`query` 5.其它检索方法简述 本系列教程教程完整目录: 目前大家公认的一个说法是 ...
- Pandas简明教程:三、Pandas文件读写
文章目录 1.CSV文件 2.Excel的读写 3.HTML文件的读写 4.其它文件(数据)类型的简单说明 5.办公自动化问题简析 本系列教程教程完整目录: Pandas支持了非常丰富的文件类型(见文 ...
最新文章
- Linux命令-安装zip和unzip命令
- PHP程序员的技术成长规划
- golang 获取两个时间 相差多少 小时
- 原生JS forEach()和map()遍历的区别以及兼容写法
- 【转】Android BroadcastReceiver介绍
- CSS背景属性彻底研究
- Kafka笔记-Spring Boot消费者构造
- 使用AspNet Core或纯静态HTML文件的跨平台桌面应用程序
- Java基础之中间件的初识
- javascript获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度
- js/vue 动态获取浏览器宽度/高度
- visio一分二的箭头_visio双箭头怎么画? visio2013绘制双箭头直线的教程
- Python爬虫16-Scrapy爬取阳光政务平台信息
- 江苏省学业水平测试信息技术软件,江苏2019年普通高中信息技术学业水平测试工作顺利结束...
- MIT CMS.300 Session 5 – UNWRITTEN RULES 游戏的潜在规则
- bootstrap 5 表单验证
- html-----简易版音乐播放器
- Docker软件安装文档
- 深度神经网络的训练过程,深度神经网络训练方法
- 各种HDR标准的技术细节,读这一篇就够了
热门文章
- android 6gb和8gb区别,手机6GB内存和8GB内存的差距到底有多大?你可能被忽悠了!...
- 详解IIS中URL重写工具的规则条件(Rule conditions)
- 在Win2003服务器系统中添加Web虚拟主机(图)
- Apache开启GZIP压缩功能方法
- (第六场)Singing Contest 【模拟】
- 【算法总结】二分搜索
- 著名站点的爬虫 —— 豆瓣
- TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(一)
- 找到一个不错的ASP.net电子图书下载网站
- Real6410的NBL1.LSB和NBL2编译下载不能启动的问题