利用pandas进行数据分析(三):缺失值处理
在实际的数据处理过程中,数据缺失是一种再平常不过的现象了。缺失值的存在极大的影响了我们数据分析结果的可靠性,以至于在数据建模前我们必须对缺失值进行处理。实际的缺失值处理主要包括两个部分:即识别数据集中的缺失值和如何处理缺失。 相较于 Python
, R
在数据缺失处理方面提供了大量的函数和包,但未免有些冗余。而 Python
中 pandas
的缺失处理则显得高效精炼。在 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
在 pandas
里 None
也是会被当成缺失处理的:
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
往期精彩:
利用pandas进行数据分析(一):Series和DataFrame数据结构
使用jupyter notebook搭建数据科学最佳交互式环境
一个数据科学热爱者的学习历程