数据质量:缺失数据处理(文末赠书)
作者:尚 涛编辑:柠檬妹
正文
前言
在几乎所有的数据仓库与数据分析挖掘项目中都会遇到缺失数据的存在,数据缺失会导致数据治好了变差,从而在数据分析项目中面临严重的数据问题。对于数值型数据,panda使用浮点数值NaN表示丢失的数据,本节的目标就是使用Pandas让处理丢失的数据变得尽可能轻松。
一般情况下,我们会使用变量的平均值填充数值型变量的缺失值,使用抽样模式填充类别变量的缺失值。对于数值型变量,缺失值一般暗示着变量的值为特定值(一般是0),在事先理解业务的情况下,使用实际值来补缺要远比使用补缺方法来猜测值更有意义,使用平均值补缺会使记录看起来很特别,当缺失比例比相对比较高时,会在分布中出现一个峰值,这可能会导致先前提及的数据分布问题。
变量是分类型的时候,缺失可以作为单独的类别来处理,在含缺失的记录所占的比例比较小的情况时,这种方法可能会出错,因为它为了少量的记录而为模型增加了一个参数,这时比较合适的做法就是默认的模式,如果整个变量对预测响应比较重要,还可以使用决策树。
检查缺失数据
为了更容易地检测缺失值,Pandas提供了isnull和notnull函数,它们也是Series和DataFrame对象的方法,我们通过实际案例来展示函数用法。
importpandas as pd
importnumpy as np
data= 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 price
0 bacon 4.2
1 Pulled Pork 3.1
2 bacon NaN
3 Pastrami NaN
4 Corned BEEF 8.5
5 Bacon 9.8
6 pastrami NaN
7 honey Ham 6.5
8 NOVA LOX 7.6
判断是否存在缺失值:
0 False
1 False
2 True
3 True
4 False
5 False
6 True
7 False
8 False
Name:price, dtype: bool
从结果客户看出,存在缺失值的输出为True,都在为False。同样我们可以调用notnull函数进行缺失值判断,代码如下所示。
print(data['price'].notnull())
执行上面示例代码,得到以下结果。
0 True
1 True
2 False
3 False
4 True
5 True
6 False
7 True
8 True
Name:price, dtype: bool
缺失数据的计算
这里需要特别注意的是在我们计算求和数据时,NA将被视为0,如果数据全部是NA,那么结果将是NA。
importpandas as pd
importnumpy as np
data= 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 pd
fromnumpy import nan as NA
df= pd.DataFrame(np.random.randn(7, 3))
df.iloc[1:5,1] = NA
df.iloc[3:6,2] = NA
df
执行上面示例代码,得到以下图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 pd
fromnumpy import nan as NA
df= pd.DataFrame(np.random.randn(5, 3))
df.iloc[2:,1] = NA
df.iloc[3:,2] = NA
df
运行程序,结果如下图4-35所示。
图4-35 含有缺失值的数据集
直接调用ffill方法来进行填充,代码如下
df.fillna(method='ffill')
运行程序,结果如下图4-36所示。
图4-36 利用索引填充缺失值的结果
我们也可以通过均值来填充缺失值,代码如下。
importpandas as pd
fromnumpy import nan as NA
data= pd.Series([4, NA,2.9, NA,8])
print('原始数据:')
print(data)
cleaned=data.fillna(data.mean())
print('均值填充结果:')
print(cleaned)
运行程序,结果如下所示。
原始数据:
0 4.0
1 NaN
2 2.9
3 NaN
4 8.0
dtype:float64
均值填充结果:
0 4.000000
1 4.966667
2 2.900000
3 4.966667
4 8.000000
dtype:float64
丢失缺失数据
如果只想排除缺少的值,则使用dropna
函数和axis
参数。默认情况下,axis=0
,即在行上应用,这意味着如果行内的任何值是NA
,那么整个行被排除。
importpandas as pd
fromnumpy import nan as NA
data= 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 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 6.5 3.0
删除缺失值后的结果:
0 1 2
0 1.0 6.5 3.0
我们可以通过参数how='all'设置,来删除所有列均为缺失值的观测数据。
print('删除所有列均为缺失值后的结果:')
cleaned= data.dropna(how='all')
print(cleaned)
执行上面示例代码,得到以下结果。
删除所有列均为缺失值后的结果:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
3 NaN 6.5 3.0
我们可以要以同样的方式删除列,此时需要传递参数axis=1。
data[4]= NA
print('原始数据:')
print(data)
print('删除都是缺失值的列后的结果:')
cleaned=data.dropna(axis=1,how='all')
print(cleaned)
执行上面示例代码,得到以下结果,第四列被删除。
原始数据:
0 1 2 4
0 1.0 6.5 3.0 NaN
1 1.0 NaN NaN NaN
2 NaN NaN NaN NaN
3 NaN 6.5 3.0 NaN
删除都是缺失值的列后的结果:
0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
2 NaN NaN NaN
3 NaN 6.5 3.0
2.贴合实际:不空讲Python语法,清晰简明地介绍如何用Python来处理、分析数据;
3.热点案例:覆盖6大热点应用领域,可直接参考研发,实现数据变现;
4.学习资源:提供所有案例源代码和数据,供读者操作练习,快速上手
“扫一扫回复:质量”