转眼国庆假期已经过去,实在不想投身工作啊。祖国母亲,咱们再过个农历生日可好,让我们再为你庆生几天。一想到2018年已无法定节假日,还是收拾心情,开始认真搬砖吧。

pandas数据分析之缺失数据处理_java

前言


原因

数据缺失在数据处理的过程中十分常见,其原因有很多,主要可以总结为三大类:

无意的:信息被遗漏,例如数据采集过程的故障导致数据缺失,例如记录过程的缺失等。

有意的:有些数据集的特征描述中将缺失值作为特征值。

不存在:有些数据的特征属性本身不存在。

类型

数据缺失的类型可以分为以下三类:

完全随机损失(missing completely at random,MCAR):数据的缺失完全是随机的,不依赖于任何不完全变量或完全变量。



随机缺失(missing at random,MAR):数据的缺失不是完全随机的,依赖于其他完全变量。


非随机缺失(missing not at random:MNAR):指的是数据的缺失依赖于不完全变量自身。


处理方式

缺失数据的处理方法包括:删除记录、数据插补和不处理。


pandas数据分析之缺失数据处理_java

处理方法


pandas的设计目标之一就是让缺失数据的处理任务尽量轻松,pandas使用浮点值NaN表示浮点和非浮点数组中的缺失数据。


pandas数据分析之缺失数据处理_java_03

生成数据集

pandas数据分析之缺失数据处理_java_04

pandas数据分析之缺失数据处理_java_05


pandas数据分析之缺失数据处理_java_04

删除记录

pandas数据分析之缺失数据处理_java_04

使用pandasdropna直接删除有缺失值的特征,该方法是根据各标签中的值是否存在缺失数据对轴标签进行过滤。


dropna默认删除任何含有缺失值得行:


pandas数据分析之缺失数据处理_java_08


传入how='any'将只丢弃全为NaN的行:


pandas数据分析之缺失数据处理_java_09


要用这种方式丢弃列,只需传入axis=1即可。


对于一个Seriesdropna返回一个仅含非空数据和索引值的Series


pandas数据分析之缺失数据处理_java_04

判断缺失情况

pandas数据分析之缺失数据处理_java_04

pandas采用isnullnotnull方法,返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值。

 pandas数据分析之缺失数据处理_java_12

获得含有缺失数据的列采用如下方法:

pandas数据分析之缺失数据处理_java_13

说明a、b、c、d、e列均含有缺失值。

获得全部为缺失数据的列的方法如下:

pandas数据分析之缺失数据处理_java_14

说明a、b、c、d、e列均不是全部为NA值的列。


pandas数据分析之缺失数据处理_java_04

填充缺失数据

pandas数据分析之缺失数据处理_java_04

       有时候,并不希望删除记录,需要通过某种方法来填充缺失数据。fillna方法是最主要的函数。

其参数主要说明如下:

value:用于填充缺失值的标量值或字典对象

method : 插值方式(ffill或bfill),如果函数调用时未指定其他参数的话,默认为“ffill” 
        axis :待填充的轴,默认axis=0 
        inplace :修改调用者对象而不产生副本 
        limit :(对于前向和后向填充)可以连续填充的最大数量 


通过一个常数调用fillna将缺失值替换为那个常数值。例如将所有缺失值替换为0:

pandas数据分析之缺失数据处理_java_17


通过一个字典调用fillna,就可以实现对不同列填充不同的值。例如对a列填充常数1,对b列填充常数0.5:

pandas数据分析之缺失数据处理_java_18


方法ffill代表后向填充,limit代表填充的最大数量:


pandas数据分析之缺失数据处理_java_19


也可以采用均值、中位数或众数插补:

pandas数据分析之缺失数据处理_java_20


pandas数据分析之缺失数据处理_java_04

总结

pandas数据分析之缺失数据处理_java_04

以上介绍了对于缺失数据的简单处理方法,包括删除记录,数据插补和不处理。具体的处理方法还要根据不同的需求来制定,需要考虑多个方面,包括数据缺失的原因、类型和随机性。关于数据插补这块,只是介绍了一个fillna函数,后续会进一步介绍其他方法,例如热卡填补、极大似然估计、拉格朗日插值等等。