分享

数据质量治理之缺失数据处理

本帖最后由 levycui 于 2020-12-15 19:31 编辑
问题导读:
1、如何检查缺失数据?
2、如何缺失数据的计算?
3、如何填充缺失数据?
4、如何丢失缺失数据?


前言

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


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


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


检查缺失数据

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

  1. importpandas as pd
  2. importnumpy as np
  3. data= pd.DataFrame({'food': ['bacon', 'Pulled Pork',
  4. 'bacon','Pastrami','Corned BEEF', 'Bacon', 'pastrami',
  5. 'honeyHam', 'NOVA LOX'],
  6. 'price': [4.2, 3.1, np.nan, np.nan, 8.5, 9.8,np.nan,6.5, 7.6]})
  7. print('原始数据:')
  8. print(data)
  9. print('判断是否存在缺失值:')
  10. print(data['price'].isnull())
复制代码

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

原始数据:
  1.           food price
  2. 0        bacon   4.2
  3. 1  Pulled Pork   3.1
  4. 2        bacon   NaN
  5. 3     Pastrami   NaN
  6. 4  Corned BEEF   8.5
  7. 5        Bacon   9.8
  8. 6     pastrami   NaN
  9. 7    honey Ham   6.5
  10. 8     NOVA LOX   7.6
复制代码

判断是否存在缺失值:
  1. 0    False
  2. 1    False
  3. 2     True
  4. 3     True
  5. 4    False
  6. 5    False
  7. 6     True
  8. 7    False
  9. 8    False
  10. Name:price, dtype: bool
复制代码

从结果客户看出,存在缺失值的输出为True,都在为False。同样我们可以调用notnull函数进行缺失值判断,代码如下所示。
  1. print(data['price'].notnull())
复制代码

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

  1. 0     True
  2. 1     True
  3. 2    False
  4. 3    False
  5. 4     True
  6. 5     True
  7. 6    False
  8. 7     True
  9. 8     True
  10. Name:price, dtype: bool
复制代码

缺失数据的计算

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

  1. importpandas as pd
  2. importnumpy as np
  3. data= pd.DataFrame({'food': ['bacon', 'Pulled Pork',
  4. 'bacon','Pastrami','Corned BEEF', 'Bacon', 'pastrami',
  5. 'honeyHam', 'NOVA LOX'],
  6. 'price':[4.2, 3.1, np.nan, np.nan, 8.5, 9.8,np.nan, 6.5, 7.6]})
  7. print('计算price列之和:')
  8. print(data['price'].sum())
复制代码

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

  1. #计算price列之和:
  2. 39.7
复制代码


填充缺失数据

Pandas提供了各种方法来清除缺失的值,fillna函数可以通过几种方法用非空数据填充缺失值,我们通过实例来说明fillna的用法。
  1. import pandas as pd
  2. fromnumpy import nan as NA
  3. df= pd.DataFrame(np.random.randn(7, 3))
  4. df.iloc[1:5,1] = NA
  5. df.iloc[3:6,2] = NA
  6. df
复制代码

执行上面示例代码,得到以下图4-32结果。
2020-12-15_191647.jpg
图4-32  含有缺失值的数据集

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

  1. df.fillna(0)
复制代码

运行程序,结果如下图4-33所示。
2020-12-15_191722.jpg
图4-33  填充缺失值结果

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

  1. df.fillna({1:0.6, 2: -1.0})
复制代码

运行程序,结果如下图4-34所示。
2020-12-15_191750.jpg
图4-34  填充缺失值结果数据

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

  1. importpandas as pd
  2. fromnumpy import nan as NA
  3. df= pd.DataFrame(np.random.randn(5, 3))
  4. df.iloc[2:,1] = NA
  5. df.iloc[3:,2] = NA
  6. df
复制代码

运行程序,结果如下图4-35所示。
2020-12-15_191817.jpg
图4-35  含有缺失值的数据集

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

  1. df.fillna(method='ffill')
复制代码

运行程序,结果如下图4-36所示。
2020-12-15_191845.jpg
图4-36  利用索引填充缺失值的结果

我们也可以通过均值来填充缺失值,代码如下。
  1. importpandas as pd
  2. fromnumpy import nan as NA
  3. data= pd.Series([4, NA,2.9, NA,8])
  4. print('原始数据:')
  5. print(data)
  6. cleaned=data.fillna(data.mean())
  7. print('均值填充结果:')
  8. print(cleaned)
复制代码

运行程序,结果如下所示。
原始数据:
  1. 0    4.0
  2. 1    NaN
  3. 2    2.9
  4. 3    NaN
  5. 4    8.0
复制代码

均值填充结果:
  1. 0    4.000000
  2. 1    4.966667
  3. 2    2.900000
  4. 3    4.966667
  5. 4    8.000000
  6. dtype:float64
复制代码


丢失缺失数据

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

  1. importpandas as pd
  2. fromnumpy import nan as NA
  3. data= pd.DataFrame([[1., 6.5, 3.], [1., NA, NA], [NA, NA, NA],
  4. [NA,6.5, 3.]])
  5. print('原始数据:')
  6. print(data)
  7. cleaned =data.dropna()
  8. print('删除缺失值后的结果:')
  9. print(cleaned)
复制代码

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

2020-12-15_191953.jpg

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

  1. print('删除所有列均为缺失值后的结果:')
  2. cleaned= data.dropna(how='all')
  3. print(cleaned)
复制代码


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

删除所有列均为缺失值后的结果:
2020-12-15_192019.jpg

我们可以要以同样的方式删除列,此时需要传递参数axis=1。
  1. data[4]= NA
  2. print('原始数据:')
  3. print(data)
  4. print('删除都是缺失值的列后的结果:')
  5. cleaned=data.dropna(axis=1,how='all')
  6. print(cleaned)
复制代码

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

2020-12-15_192053.jpg

作者:尚涛
来源:https://mp.weixin.qq.com/s/IjIaOpbUOztPmMu2JwnU6g

最新经典文章,欢迎关注公众号


没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条