利用python进行数据分析
第五章:pandas入门
第四节,缺失数据处理
pandas使用浮点值NaN(Not a Number)表示浮点和非浮点数组中的缺失数据。它只是一个便于被检测出来的标记而已
>>> string_data=Series(['aardvark', 'artichoke', np.nan, 'avocado'])
>>> string_data
0 aardvark
1 artichoke
2 NaN
3 avocado
dtype: object
表5-12:NA处理方法
| 方法 | 说明 |
| dropna | 根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度 |
| fillna | 用指定值或插值方法(如ffill或bfill)填充缺失数据 |
| isnull | 返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值/NA,该对象的类型与源类型一样 |
| notnull | isnull的否定式 |
1,滤除缺失数据
对于一个Series,dropna返回一个仅含非空数据和索引值的Series
>>> data=Series([1, np.nan, 3.5, np.nan, 7])
>>> data.dropna()
0 1.0
2 3.5
4 7.0
dtype: float64
也可以通过布尔型索引达到上述结果
>>> data.notnull()
0 True
1 False
2 True
3 False
4 True
dtype: bool
>>> data[data.notnull()]
0 1.0
2 3.5
4 7.0
dtype: float64
对于DataFrame对象,dropna默认丢弃任何含有缺失值的行
>>> from numpy import nan as NA
>>> data=DataFrame([[1., 6.5, 3.], [1., NA, NA], [NA, NA, NA], [NA, 6.5, 3.]])
>>> data
····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
>>> data.dropna()
····0 1 2
0 1.0 6.5 3.0
#dropna默认丢弃任何含有缺失值的行
传入how=’all’将只丢弃全为NA的那些行
>>> data.dropna(how='all')
····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
>>> data
····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
>>> data.dropna(axis=1, how='all')
····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
同时去掉存在NA值的行和列
>>> data.dropna(how='all').dropna(axis=1, how='all')
····0 1 2
0 1.0 6.5 3.0
1 1.0 NaN NaN
3 NaN 6.5 3.0
假设你只想留下一部分观测数据,可用thresh参数实现该功能
>>> df=DataFrame(np.random.randn(7, 3))
>>> df.ix[:4, 1]=np.nan; df.ix[:2, 2]=np.nan
>>> df
····0 1 2
0 0.163969 NaN NaN
1 -0.230243 NaN NaN
2 -0.328058 NaN NaN
3 2.031652 NaN -0.724225
4 0.374774 NaN -1.004677
5 -0.346326 0.770391 -0.707876
6 -0.994920 -1.488515 -1.560476
>>> df.dropna(thresh=3) #保留3种索引均存在数据的行和列
0 1 2
5 -0.346326 0.770391 -0.707876
6 -0.994920 -1.488515 -1.560476
>>> df.dropna(thresh=2) #仅仅保留一行存在NA值
····0 1 2
3 2.031652 NaN -0.724225
4 0.374774 NaN -1.004677
5 -0.346326 0.770391 -0.707876
6 -0.994920 -1.488515 -1.560476
>>> df.dropna(thresh=1) #如果某行内存在两个NA值则thresh=1不能去除仅存在一个NA值的那行数据
0 1 2
0 0.163969 NaN NaN
1 -0.230243 NaN NaN
2 -0.328058 NaN NaN
3 2.031652 NaN -0.724225
4 0.374774 NaN -1.004677
5 -0.346326 0.770391 -0.707876
6 -0.994920 -1.488515 -1.560476
2,填充缺失数据
fillna函数可将缺失值替换为常数值
>>> df.fillna('-') #填补字符串
····0 1 2
0 0.163969 - -
1 -0.230243 - -
2 -0.328058 - -
3 2.031652 - -0.724225
4 0.374774 - -1.00468
5 -0.346326 0.770391 -0.707876
6 -0.994920 -1.48851 -1.56048
>>> df.fillna(0) #填补纯数字
0 1 2
0 0.163969 0.000000 0.000000
1 -0.230243 0.000000 0.000000
2 -0.328058 0.000000 0.000000
3 2.031652 0.000000 -0.724225
4 0.374774 0.000000 -1.004677
5 -0.346326 0.770391 -0.707876
6 -0.994920 -1.488515 -1.560476
df.fillna()函数对不同列进行填充
>>> df.fillna({1: 0.5, 2: 0}) #对第一列填充0.5而对第二列填充0
····0 1 2
0 0.163969 0.500000 0.000000
1 -0.230243 0.500000 0.000000
2 -0.328058 0.500000 0.000000
3 2.031652 0.500000 -0.724225
4 0.374774 0.500000 -1.004677
5 -0.346326 0.770391 -0.707876
6 -0.994920 -1.488515 -1.560476
同样bfill方法可向前填充,limit表示填充两次
>>> df.fillna(method='bfill', limit=2)
····0 1 2
0 0.163969 NaN NaN
1 -0.230243 NaN -0.724225
2 -0.328058 NaN -0.724225
3 2.031652 0.770391 -0.724225
4 0.374774 0.770391 -1.004677
5 -0.346326 0.770391 -0.707876
6 -0.994920 -1.488515 -1.560476
表5-13:fillna函数的参数
| 参数 | 说明 |
| value | 用于填充缺失值的标量值或字典对象 |
| method | 插值方式。如果函数调用时未指定其他参数的话,默认为“ffill” |
| axis | 待填充的轴,默认axis=0 |
| inplace | 修改调用者对象而不产生副本 |
| limit | (对于前向和后向填充)可以连续填充的最大数量 |