利用pandas进行数据分析(三):缺失值处理

     在实际的数据处理过程中,数据缺失是一种再平常不过的现象了。缺失值的存在极大的影响了我们数据分析结果的可靠性,以至于在数据建模前我们必须对缺失值进行处理。实际的缺失值处理主要包括两个部分:即识别数据集中的缺失值和如何处理缺失。 相较于 Python, R在数据缺失处理方面提供了大量的函数和包,但未免有些冗余。而 Pythonpandas的缺失处理则显得高效精炼。在 pandas中,不必去计较你的数据集中的缺失到底是随机缺失还是非随机缺失,你只需要用 pandas函数将缺失识别出来然后视数据集大小决定是删除还是插补就可以了。

缺失值的识别

     作为 pandas最初的设计目标之一,尽可能简单的处理缺失值是其一大特点。 pandas使用浮点值 NaN表示浮点和非浮点数组中的缺失数据,其意义只是为了能让pandas将其检测出为缺失值而已。 创建一个包含缺失值的 Series:

import pandas as pd	
import numpy as np	
nba_data = pd.Series(['rockets','mavericks',np.nan,'spurs'])	
nba_data	
0      rockets	
1    mavericks	
2          NaN	
3        spurs	
dtype: object

     使用 isnull方法识别缺失:

#识别缺失值	
nba_data.isnull()	
0    False	
1    False	
2     True	
3    False	
dtype: bool

     在 pandasNone也是会被当成缺失处理的:

nba_data[0] = None	
nba_data.isnull()	
0     True	
1    False	
2     True	
3    False	
dtype: bool
剔除缺失值

     如果缺失值在数据集中只有少量数据,因而对最后的数据分析结果并无大的影响的情况下,我们大可直接将其从数据集中剔除,这是最简单快速的一种缺失数据的处理方案。 pandas提供了 dropna方法可以剔除缺失:

#dropna方法剔除缺失	
from numpy import nan as NA	
data = pd.Series([1,NA,2,5,NA])	
data.dropna()	
0    1.0	
2    2.0	
3    5.0	
dtype: float64

     当然也可以通过布尔逻辑型索引对缺失进行剔除:

#也可以通过布尔型索引去除缺失	
data[data.notnull()]	
0    1.0	
2    2.0	
3    5.0	
dtype: float64

     以上是针对 Series的缺失值剔除方法,再来看 DataFrame:

#DataFrame中的缺失处理	
data2 = pd.DataFrame([[NA,2,3],[NA,NA,4],[5,6,7],[NA,NA,NA]])	
data2_cleaned = data2.dropna()	
data2	
	
0    1   2	
0    NaN 2.0 3.0	
1    NaN NaN 4.0	
2    5.0 6.0 7.0	
3    NaN NaN NaN	
data2_cleaned	
    0   1   2	
2    5.0 6.0 7.0

     针对 DataFrame的行列属性,我们也可以选择在指定行和列上进行缺失值剔除:

#设定参数选择筛选掉全部为NA的行	
data2.dropna(how='all')	
    0   1   2	
0    NaN 2.0 3.0	
1    NaN NaN 4.0	
2    5.0 6.0 7.0	
#也可以按行列对缺失进行筛选	
data2[4] = NA	
data2	
    0   1   2   4	
0    NaN 2.0 3.0 NaN	
1    NaN NaN 4.0 NaN	
2    5.0 6.0 7.0 NaN	
3    NaN NaN NaN NaN	
data2.dropna(axis=1,how='all')	
    0   1   2	
0    NaN 2.0 3.0	
1    NaN NaN 4.0	
2    5.0 6.0 7.0	
3    NaN NaN NaN
插补缺失值

     在缺失数据较少的情形下,对缺失值直接进行剔除是没问题的,一旦数据集中数据缺失量达到很大比例,恐怕简单的数据剔除并不是一个好的办法。这时候缺失数据的插补法是一个较好的方法, pandas提供了灵活的数据插补方法。

#创建一个带有缺失的DataFrame	
df = pd.DataFrame(np.random.randn(4,5))	
df.loc[:1,1] = NA	
df.loc[:2,3] = NA	
df	
0    1   2   3   4	
0    0.328507    NaN 1.039043    NaN -1.144255	
1    1.417364    NaN 2.347842    NaN -0.746301	
2    2.173780    -1.456884   1.461296    NaN -0.131479	
3    1.034509    0.906970    1.602493    -0.997169   0.323702

fillna为缺失值的插补提供了灵活的处理方案:

#fillna方法是pandas主要的数据插补方法	
#用0插补	
df.fillna(0)	
0    1   2   3   4	
0    0.328507    0.000000    1.039043    0.000000    -1.144255	
1    1.417364    0.000000    2.347842    0.000000    -0.746301	
2    2.173780    -1.456884   1.461296    0.000000    -0.131479	
3    1.034509    0.906970    1.602493    -0.997169   0.323702

     可以使用字典进行插补:

#使用字典对指定列进行插补	
df.fillna({1:0.5,3:-0.5})	
	
0    1   2   3   4	
0    0.328507    0.500000    1.039043    -0.500000   -1.144255	
1    1.417364    0.500000    2.347842    -0.500000   -0.746301	
2    2.173780    -1.456884   1.461296    -0.500000   -0.131479	
3    1.034509    0.906970    1.602493    -0.997169   0.323702

     也可以自定义一些数据插补方法,比如均值插补等:

#使用均值插补	
data3 = pd.Series([103,112,NA,121,98,NA])	
data3.fillna(data3.mean())	
0    103.0	
1    112.0	
2    108.5	
3    121.0	
4     98.0	
5    108.5	
dtype: float64	
	
#使用最大值插补	
data3.fillna(data3.max())	
0    103.0	
1    112.0	
2    121.0	
3    121.0	
4     98.0	
5    121.0	
dtype: float64

     关于 pandas数据缺失的处理内容,小编就介绍到这哪儿啦。

参考资料:

python for data analysis

往期精彩:


一个数据科学热爱者的学习历程

640?
640?wx_fmt=jpeg
长按二维码.关注数据科学家养成记

640?wx_fmt=jpeg

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值