利用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 | (对于前向和后向填充)可以连续填充的最大数量 |