joyful-pandas(下)学习笔记——第6章 缺失数据

joyful-pandas(下)学习笔记——第6章 缺失数据

  理想情况下,数据进行完分组变形合并,就可以开始进行下一步数理统计分析了。但是,实际上还有一项非常艰巨的任务需要提前完成,那就是缺失数据的处理。如果忽略缺失数据的处理,很多运算会报错,或者流畅地运行完但是并不能得到期望的处理结果。
  除了数据表合并时候索引不对应造成的数据缺失,日常应用中还会接触到大量原生数据中自带的缺失,比如客户填写资料时某些空格没有填写、传感器采集数据时出现传感器或者通信线路故障导致数据没有被写入数据表等等。
  实际中出现的缺失数据可能并不一定表现为nan、None等等pandas中已有的缺失值类型,而是表现为"-"、空格等等字符类型。字符型缺失值来源之一是前端和后端系统工程师对于空值的独特理解,还有一部分是填写资料的客户千奇百怪的脑洞。不过这些不在本章讨论范围内,下一章“文本数据”中将会提及字符类型异常数据的处理方法。

一、缺失观测及其类型

1. 了解缺失信息

(a)isna和notna方法

  这两个方法主要是生成一个布尔类型的列表或者矩阵,用来表示数值是否缺失。看起来好像对我们人工观察数据情况并没有什么太大的帮助,但是可能在稀疏矩阵的计算机处理中,可以优化存储空间或者运算速度。

df.isna().head()

在这里插入图片描述

(b)查看缺失值的所在行

  不过,实际工作中,苦逼的数据分析师多数情况下还是需要自己去人工查看数据,人脑通过直觉和经验进行初步判断的。所以我们更关心缺失值的统计信息,即数据中含有多少缺失值以及它们在哪儿、占所有数据的比例等等。

df[df['Physics'].isna()]

在这里插入图片描述
  对数据进行直观地观察,在目前来说,对于我们后续选择合适的处理方法有非常重要的意义。当然,也许以后会开发出数据预处理的自动化实现模块,所以数据分析师们一定要努力学习行业知识,争取在人工智能全面取代数分的时代做一个人肉标签机,而不至于失业。

2. 三种缺失符号

  除了千奇百怪的字符,pandas中表示缺失的符号也是性格各异。

(a)np.nan

  np.nan本来是numpy中的原生神坑,有许多违反程序员惯常思维的神奇操作,神奇到陈天奇制作xgboost的时候,直接放弃了numpy自己写了个矩阵处理模块。而基于numpy数据处理的pandas被迫接盘,且没能针对这一迷之存在做出很好的处理,一直在修修补补。如果在数据处理中发现一些匪夷所思的数据运算错误,或者离开预期很远的结果,都可以试试将np.nan替换掉再处理。

np.nan是一个麻烦的东西,首先它不等于任何东西,甚至不等于自己

  很多时候我们有一种用 " if i == *** " 来查找、筛选、替换某个值的惯性思维,然而,用这行代码你将永远找不到np.nan,因为它压根儿就不等于自己,也不等于任何别的值,每一个np.nan都是独一无二的(真佩服numpy工程师,他们是怎么实现出这种神奇存在的)。
在这里插入图片描述
  还要补充一点,如果你是一个执着的程序猿,并且聪明地企图用转化为bool的方式来筛出np.nan,那么恐怕你又要失望了。将Series或者DataFrame转变为bool型时,np.nan会变为True!!!
  是不是很惊喜?
在这里插入图片描述
  当然,如果使用isna()和notna()则不会有这种困扰,但是这一操作又会漏掉非缺失值类型的0、空格等,非要逼着你在bool之前把所有需要变False的数据清理统一一下。

其次,它在numpy中的类型为浮点,由此导致数据集读入时,即使原来是整数的列,只要有缺失值就会变为浮点型

  float64的精度为15位有效数字,而int64为18位,所以一些长整数串中一旦出现np.nan,就会莫名其妙被砍掉一截。
  当然,你可以先把长整数串转为字符串,这样就不会被转化为浮点了。

  • 但是如果想要运用插值法消除np.nan呢?要为np.nan处插入一个数值。
  • 要插入数值?需要先将字符串转化为数值进行比较或计算。
  • 转化为数值?又要因为精度问题被砍掉一截。

  陷入无解死循环。

(b)None

  None似乎是基于C编译器的系统空值,它也保留了C程序设计思维中的一些良好特性。
在这里插入图片描述
  看起来似乎很美好,可以考虑替代np.nan?遗憾的是,None似乎只能手工逐个命名,无法自动在pandas中生成。pandas默认生成的只有np.nan和NaT(时序版np.nan,和np.nan一样拥有不等于自身、布尔值为True等神奇特性)。
  更为抓狂的是,如果该列为数值型,那么连手工命名为None也无法做到,系统会自动将其转换为np.nan,顺便再将整列数据类型都变成float64(如果是int型的话)。

3. Nullable类型与NA符号

  可能为np.nan抓狂的程序猿太多,pandas1.0版本中推出了一个补丁般的新类型"Nullable"(允许空值存在的类型?原来numpy很多数据类型都是不允许空值存在的),试图解决之前np.nan的一些神奇操作问题。
  Nullable并不是一个具体的类型名,而是一些新类型的统称,目前包含"Int64"、“boolean"和"string"三个具体的数据类型。看起来这个类型的命名似乎有些随意,特别是整形和布尔型,我们只要理解它们实际上就是“允许空值存在的整型”和“允许空值存在的布尔型”就好。
  Nullable型空值都显示为”<NA>",但是具体查看dtype的时候会显示它们的类型分别为"Int64"、“boolean"和"string”。

它的好处就在于,其中前面提到的三种缺失值都会被替换为统一的NA符号,且不改变数据类型

在这里插入图片描述

4. NA的特性

  NA虽然是对np.nan神奇特性的一种补救,然而它自身依然有许多奇妙的特性,在使用中需要注意。

(a)逻辑运算

  NA是一个没有布尔值的存在,它既不是True也不是False,如果直接对NA取布尔值会报错。然而,它居然可以作为一个第三类存在参与逻辑运算(搞不懂这个“逻辑运算”背后的逻辑是什么样子。。。)。
  np.nan的布尔值为True,这一点与pd.NA是不同的。

只需看该逻辑运算的结果是否依赖pd.NA的取值,如果依赖,则结果还是NA,如果不依赖,则直接计算结果

在这里插入图片描述

(b)算术运算和比较运算

  在我的认知中,缺失值应该是不能进行任何算术或者比较运算的,即它们的运算结果应该永远为缺失值。然而,np.nan却偏偏有两个反常规认知的操作,可以经过算术运算得到一个数值。然后,pd.NA也完美地继承了这一神奇特性。它俩这一点是完全一样的。
  不过,除这两个运算之外的其它情况,运算结果都是缺失值自身。
在这里插入图片描述

5. convert_dtypes方法

  现在,我们可以通过强制类型转换,把有可能会出现缺失值的列预先转换为Nullable类型,防止因为索引对齐之类数据处理问题产生的np.nan了。
  但是,对于数据中本就存在的缺失值,直接读取文件时默认还是会转为np.nan。为了让数据被读入的时候就直接被转为pd.NA,补丁制造者们提供了一个专门的函数convert_dtypes()。读取数据时配套使用,从源头无缝对接pd.NA,解决部分数据格式被强制转换等问题。
  当然,pd.NA自身还存在相当多各种bug,使用时依然会出现各种各样的问题,神奇程度不亚于np.nan。所以,在不稳定的现阶段,如果不是有充足的时间又勇于踩坑,还是使用我们熟悉的np.nan可能会更流畅一些(前提是你已经熟悉了np.nan)。
在这里插入图片描述

本文是对joyful-pandas教程的学习思考,感谢GYH大佬的分享!感谢Datawhale的学习组织!
joyful-pandas教程地址http://dwz.date/aZCT
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值