文章目录

  • 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()是针对数值的操作,默认就将TureFalse转为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).
  • ‘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.1 快速导航链接· 二.端口延迟 2.1 输入有效 2.2 输出有效 2.3 set_input_delay 2.3.1 -clock clock_name 2.3.2 - ...

  2. Pandas简明教程:九、表的合并、连接、拼接(数据聚合基础)

    真实场景中常会遇到多种信息放在不同的表里的情况,此时我们就需要将这些表格的信息整合到一起.这种操作可以极大地减轻我们手动粘数据的工作,从而达到事半功倍的效果. 由于本篇要举的例子较多,因此直接采用官网 ...

  3. Pandas简明教程:八、Pandas数据透视表

    透视表(pivot)是由微软发明的一个概念,1993年微软注册了PivotTable这一商标,而他们又在2020年正式撤销了注册. 关于透视表的话题随便搜搜就是一大堆,而有些地方可能都吹得很神了.透视 ...

  4. Pandas简明教程:四、Pandas数据索引方式

    文章目录 1.以类似`dict`的方式访问 2.以属性方式访问数据 3.访问行(slicing) 4.用`loc`方法访问不同行列 5.用`iloc`方法直接访问行列 6.其它方式 本系列教程教程完整 ...

  5. 系统重温Pandas笔记:(七)缺失数据

    文章目录 写在前面 一.缺失值的统计和删除 1. 缺失信息的统计 2. 缺失信息的删除 二.缺失值的填充和插值 1. 利用fillna进行填充 [练一练] 2. 插值函数 三.Nullable类型 1 ...

  6. Pandas简明教程-适用于竞赛、研究以及办公自动化

    数据的读.写.查.改是数据分析的基础,也是竞赛.研究以及办公自动化类项目的常用操作.为了让大家能以更简单的方法来操作数据,我们选择Pandas作为处理数据的工具,希望通过这个系列的教程能够帮助大家节省 ...

  7. Pandas简明教程:五、Pandas简单统计操作及通用方式

    文章目录 1.DataFrame的方法使用举例 2.DataFrame的方法调用通用方式 3.DataFrame直接调用其它方法 本系列教程教程完整目录: 前面已经提到,Pandas的DataFram ...

  8. Pandas简明教程:六、Pandas条件查询

    文章目录 1.基本方法 2.高级查询 3. 可用于修改内容的`where`方法 4.条件检索进阶:快速的查询方法`query` 5.其它检索方法简述 本系列教程教程完整目录: 目前大家公认的一个说法是 ...

  9. Pandas简明教程:三、Pandas文件读写

    文章目录 1.CSV文件 2.Excel的读写 3.HTML文件的读写 4.其它文件(数据)类型的简单说明 5.办公自动化问题简析 本系列教程教程完整目录: Pandas支持了非常丰富的文件类型(见文 ...

最新文章

  1. Linux命令-安装zip和unzip命令
  2. PHP程序员的技术成长规划
  3. golang 获取两个时间 相差多少 小时
  4. 原生JS forEach()和map()遍历的区别以及兼容写法
  5. 【转】Android BroadcastReceiver介绍
  6. CSS背景属性彻底研究
  7. Kafka笔记-Spring Boot消费者构造
  8. 使用AspNet Core或纯静态HTML文件的跨平台桌面应用程序
  9. Java基础之中间件的初识
  10. javascript获取浏览器窗口大小 获取屏幕,浏览器,网页高度宽度
  11. js/vue 动态获取浏览器宽度/高度
  12. visio一分二的箭头_visio双箭头怎么画? visio2013绘制双箭头直线的教程
  13. Python爬虫16-Scrapy爬取阳光政务平台信息
  14. 江苏省学业水平测试信息技术软件,江苏2019年普通高中信息技术学业水平测试工作顺利结束...
  15. MIT CMS.300 Session 5 – UNWRITTEN RULES 游戏的潜在规则
  16. bootstrap 5 表单验证
  17. html-----简易版音乐播放器
  18. Docker软件安装文档
  19. 深度神经网络的训练过程,深度神经网络训练方法
  20. 各种HDR标准的技术细节,读这一篇就够了

热门文章

  1. android 6gb和8gb区别,手机6GB内存和8GB内存的差距到底有多大?你可能被忽悠了!...
  2. 详解IIS中URL重写工具的规则条件(Rule conditions)
  3. 在Win2003服务器系统中添加Web虚拟主机(图)
  4. Apache开启GZIP压缩功能方法
  5. (第六场)Singing Contest 【模拟】
  6. 【算法总结】二分搜索
  7. 著名站点的爬虫 —— 豆瓣
  8. TWaver html5 + NodeJS + express + websocket.io + redis 快速搭建项目(一)
  9. 找到一个不错的ASP.net电子图书下载网站
  10. Real6410的NBL1.LSB和NBL2编译下载不能启动的问题