查看原文
其他

数据质量:缺失数据处理(文末赠书)

尚涛​ 数据仓库与Python大数据 2022-07-01

导读:文末正版好书赠送《Python数据分析全流程实操指南》活动5本,等你参与哦!


☞ 关注公众号『数据仓库与Python大数据』,获取更多优质资源与干货文章

作者:尚 涛编辑:柠檬妹





正文



前言


在几乎所有的数据仓库与数据分析挖掘项目中都会遇到缺失数据的存在,数据缺失会导致数据治好了变差,从而在数据分析项目中面临严重的数据问题。对于数值型数据,panda使用浮点数值NaN表示丢失的数据,本节的目标就是使用Pandas让处理丢失的数据变得尽可能轻松。


一般情况下,我们会使用变量的平均值填充数值型变量的缺失值,使用抽样模式填充类别变量的缺失值。对于数值型变量,缺失值一般暗示着变量的值为特定值(一般是0),在事先理解业务的情况下,使用实际值来补缺要远比使用补缺方法来猜测值更有意义,使用平均值补缺会使记录看起来很特别,当缺失比例比相对比较高时,会在分布中出现一个峰值,这可能会导致先前提及的数据分布问题。


变量是分类型的时候,缺失可以作为单独的类别来处理,在含缺失的记录所占的比例比较小的情况时,这种方法可能会出错,因为它为了少量的记录而为模型增加了一个参数,这时比较合适的做法就是默认的模式,如果整个变量对预测响应比较重要,还可以使用决策树。




检查缺失数据


为了更容易地检测缺失值,Pandas提供了isnullnotnull函数,它们也是SeriesDataFrame对象的方法,我们通过实际案例来展示函数用法。

importpandas as pdimportnumpy as npdata= pd.DataFrame({'food': ['bacon', 'Pulled Pork','bacon','Pastrami','Corned BEEF', 'Bacon', 'pastrami','honeyHam', 'NOVA LOX'],'price': [4.2, 3.1, np.nan, np.nan, 8.5, 9.8,np.nan,6.5, 7.6]})print('原始数据:')print(data)print('判断是否存在缺失值:')print(data['price'].isnull())


执行上面示例代码,得到以下结果。

原始数据: food price0 bacon 4.21 Pulled Pork 3.12 bacon NaN3 Pastrami NaN4 Corned BEEF 8.55 Bacon 9.86 pastrami NaN7 honey Ham 6.58 NOVA LOX 7.6判断是否存在缺失值:0 False1 False2 True3 True4 False5 False6 True7 False8 FalseName:price, dtype: bool


从结果客户看出,存在缺失值的输出为True,都在为False。同样我们可以调用notnull函数进行缺失值判断,代码如下所示。

print(data['price'].notnull())

执行上面示例代码,得到以下结果。

0 True1 True2 False3 False4 True5 True6 False7 True8 TrueName:price, dtype: bool




缺失数据的计算


这里需要特别注意的是在我们计算求和数据时,NA将被视为0如果数据全部是NA,那么结果将是NA

importpandas as pdimportnumpy as npdata= pd.DataFrame({'food': ['bacon', 'Pulled Pork','bacon','Pastrami','Corned BEEF', 'Bacon', 'pastrami','honeyHam', 'NOVA LOX'],'price':[4.2, 3.1, np.nan, np.nan, 8.5, 9.8,np.nan, 6.5, 7.6]})print('计算price列之和:')print(data['price'].sum())


执行上面示例代码,得到以下结果。

#计算price列之和:39.7




填充缺失数据


Pandas提供了各种方法来清除缺失的值,fillna函数可以通过几种方法用非空数据填充缺失值,我们通过实例来说明fillna的用法。

import pandas as pdfromnumpy import nan as NAdf= pd.DataFrame(np.random.randn(7, 3))df.iloc[1:5,1] = NAdf.iloc[3:6,2] = NAdf


执行上面示例代码,得到以下图4-32结果。

4-32  含有缺失值的数据集

首先我们用0值填充缺失值,代码如下所示。

df.fillna(0)

运行程序,结果如下图4-33所示。

4-33  填充缺失值结果

接着,我们可以用0.6替换1列的缺失值,用-1.0替换2列的缺失值,代码如下所示。

df.fillna({1:0.6, 2: -1.0})

运行程序,结果如下图4-34所示。

4-34  填充缺失值结果数据

可以利用前一个索引值来填充当前的缺失值,代码如下所示。

importpandas as pdfromnumpy import nan as NAdf= pd.DataFrame(np.random.randn(5, 3))df.iloc[2:,1] = NAdf.iloc[3:,2] = NAdf


运行程序,结果如下图4-35所示。

4-35  含有缺失值的数据集

直接调用ffill方法来进行填充,代码如下

df.fillna(method='ffill')


运行程序,结果如下图4-36所示。

4-36  利用索引填充缺失值的结果

我们也可以通过均值来填充缺失值,代码如下。

importpandas as pdfromnumpy import nan as NAdata= pd.Series([4, NA,2.9, NA,8])print('原始数据:')print(data)cleaned=data.fillna(data.mean())print('均值填充结果:')print(cleaned)运行程序,结果如下所示。原始数据:0 4.01 NaN2 2.93 NaN4 8.0dtype:float64均值填充结果:0 4.0000001 4.9666672 2.9000003 4.9666674 8.000000dtype:float64




丢失缺失数据


如果只想排除缺少的值,则使用dropna函数和axis参数。默认情况下,axis=0,即在行上应用,这意味着如果行内的任何值是NA,那么整个行被排除。

importpandas as pdfromnumpy import nan as NAdata= pd.DataFrame([[1., 6.5, 3.], [1., NA, NA], [NA, NA, NA],[NA,6.5, 3.]])print('原始数据:')print(data)cleaned =data.dropna()print('删除缺失值后的结果:')print(cleaned)


执行上面示例代码,得到以下结果。

原始数据: 0 1 20 1.0 6.5 3.01 1.0 NaN NaN2 NaN NaN NaN3 NaN 6.5 3.0删除缺失值后的结果: 0 1 20 1.0 6.5 3.0


我们可以通过参数how='all'设置,来删除所有列均为缺失值的观测数据。

print('删除所有列均为缺失值后的结果:')cleaned= data.dropna(how='all')print(cleaned)


执行上面示例代码,得到以下结果。

删除所有列均为缺失值后的结果: 0 1 20 1.0 6.5 3.01 1.0 NaN NaN3 NaN 6.5 3.0


我们可以要以同样的方式删除列,此时需要传递参数axis=1

data[4]= NAprint('原始数据:')print(data)print('删除都是缺失值的列后的结果:')cleaned=data.dropna(axis=1,how='all')print(cleaned)


执行上面示例代码,得到以下结果,第四列被删除。

原始数据: 0 1 2 40 1.0 6.5 3.0 NaN1 1.0 NaN NaN NaN2 NaN NaN NaN NaN3 NaN 6.5 3.0 NaN删除都是缺失值的列后的结果: 0 1 20 1.0 6.5 3.01 1.0 NaN NaN2 NaN NaN NaN3 NaN 6.5 3.0


本文摘自北京大学出版社《Python数据分析全流程实操指南》一书中,略有删改,按出版书中为准,出版社独家授权发布。


延伸阅读《Python数据分析全流程实操指南》
可点击上图了解及购买


 推荐语 
1.内容全面:借助5大Python工具库,实现数据分析从获取到建模全流程覆盖;
2.贴合实际:不空讲Python语法,清晰简明地介绍如何用Python来处理、分析数据;
3.热点案例:覆盖6大热点应用领域,可直接参考研发,实现数据变现;
4.学习资源:提供所有案例源代码和数据,供读者操作练习,快速上手
本书主要围绕整个数据分析方法论的常规流程,介绍了Python常用的工具包,包括科学计算库Numpy、数据分析库Pandas、数据挖掘库Scikit-Learn,以及数据可视化库Matplotlib和Seaborn的基本知识,并从数据分析挖掘的实际业务应用出发,讲解了互联网、金融及零售等行业的真实案例,比如客户分群、产品精准营销、房价预测、特征降维等,深入浅出、循序渐进地介绍了Python数据分析的全过程。
更多精彩福利



送书环节来了,现在公众号回复“质量”,即可参与抽奖一共5~


“扫一扫回复:质量”


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存