简介
在数据处理过程中经常会碰到缺失数据,pandas提供了一套处理缺失数据的方法。缺失数据通常用NaN
(not a number)表示,它是一个可以被检测出来的标记。默认在所有的统计描述中都排除缺失数据。
方法
处理缺失数据有如下几种方法:
方法 | 描述 |
---|---|
dropna() | 根据各标签的值中是否存在缺失数据对轴标签进行过滤,可通过阈值调节对缺失值的容忍度 |
fillna() | 用指定值或插值方法填充缺失数据 |
isnull() | 返回一个含有布尔值的对象,这些布尔值表示哪些值是缺失值NA,该对象的类型与源类型一样 |
notnull() | isnull的否定式 |
接下来一一介绍。
isnull()/notnull()方法
这两个方法能够判断数据中是否有缺失值,返回布尔值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
>>>import pandas as pd >>>a = pd.Series([1, 2, np.nan, 4]) >>>a.isnull() 0 False 1 False 2 True 3 False dtype: bool >>>a.notnull() 0 True 1 True 2 False 3 True dtype: bool >>>b = pd.DataFrame([[2, np.nan], [3, np.nan]]) >>>b 0 1 0 2 NaN 1 3 NaN >>>b.isnull() 0 1 0 False True 1 False True >>>b.notnull() 0 1 0 True False 1 True False |
dropna()方法
可以通过dropna()
方法丢弃含缺失值的数据,对于一个Series返回非空数据和索引值:
1 2 3 4 5 6 7 8 9 10 |
>>>import pandas as pd >>>import numpy as np >>>a = pd.Series([1, np.nan, 3, 5, np.nan, 10]) >>>a.dropna() 0 1.0 2 3.0 3 5.0 5 10.0 dtype: float64 |
在DataFrame中使用该方法可以指定丢弃的方式,全部丢弃还是指定行或列。默认是丢弃任何含有缺失值的行:
1 2 3 4 5 6 7 8 9 10 11 |
>>>b = pd.DataFrame([[1, 2, 3], [4, np.nan, np.nan], [np.nan, np.nan, np.nan], [np.nan, 5, 6]]) >>>b 0 1 2 0 1.0 2.0 3.0 1 4.0 NaN NaN 2 NaN NaN NaN 3 NaN 5.0 6.0 >>>b.dropna() 0 1 2 0 1.0 2.0 3.0 |
传入关键字how='all'
将只丢弃全部为NaN
的行:
1 2 3 4 5 |
>>>b.dropna(how='all') 0 1 2 0 1.0 2.0 3.0 1 4.0 NaN NaN 3 NaN 5.0 6.0 |
还可以通过axis
参数指定丢弃的轴:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
>>>b[4]=np.nan >>>b 0 1 2 4 0 1.0 2.0 3.0 NaN 1 4.0 NaN NaN NaN 2 NaN NaN NaN NaN 3 NaN 5.0 6.0 NaN >>>b.dropna(axis=1, how='all') 0 1 2 0 1.0 2.0 3.0 1 4.0 NaN NaN 2 NaN NaN NaN 3 NaN 5.0 6.0 |
使用thresh
参数可以控制阈值,表示至少含有thresh
个非NaN
值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
>>>c = pd.DataFrame(np.random.randn(4, 4)) >>>c.iloc[0, :] = np.nan >>>c.iloc[1, 1:] = np.nan >>>c.iloc[2, 2:] = np.nan >>>c 0 1 2 3 0 NaN NaN NaN NaN 1 -0.996363 NaN NaN NaN 2 0.913442 -1.162916 NaN NaN 3 1.609045 1.420601 0.043001 0.353668 >>>c.dropna(thresh=2) 0 1 2 3 2 0.913442 -1.162916 NaN NaN 3 1.609045 1.420601 0.043001 0.353668 |
fillna()方法
该方法可以填充缺失值,并且可以指定填充的方式,它的参数说明如下:
参数 | 描述 |
---|---|
value | 用于填充缺失值的标量值或字典对象 |
method | 插值方式,默认为前向插值‘ffill’ |
axis | 指定填充的轴,默认为0 |
inplace | 修改原对象而不产生副本 |
limit | 对于前向或后向填充规定填充的最大次数 |
最简单的方式就是指定常数值替换缺失值:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
>>>c 0 1 2 3 0 NaN NaN NaN NaN 1 -0.996363 NaN NaN NaN 2 0.913442 -1.162916 NaN NaN 3 1.609045 1.420601 0.043001 0.353668 >>>c.fillna(0) 0 1 2 3 0 0.000000 0.000000 0.000000 0.000000 1 -0.996363 0.000000 0.000000 0.000000 2 0.913442 -1.162916 0.000000 0.000000 3 1.609045 1.420601 0.043001 0.353668 |
或者可以使用一个字典对不同的列填充不同的值,把列作为key
:
1 2 3 4 5 6 |
>>>c.fillna({0:1, 1: 5, 2: 0}) 0 1 2 3 0 1.000000 5.000000 0.000000 NaN 1 -0.996363 5.000000 0.000000 NaN 2 0.913442 -1.162916 0.000000 NaN 3 1.609045 1.420601 0.043001 0.353668 |
使用method
参数能够指定填充的方式:
1 2 3 4 5 6 |
>>>c.fillna(method='bfill') 0 1 2 3 0 -0.996363 -1.162916 0.043001 0.353668 1 -0.996363 -1.162916 0.043001 0.353668 2 0.913442 -1.162916 0.043001 0.353668 3 1.609045 1.420601 0.043001 0.353668 |
'bfill'
是指用后一行的数填充前一行,或者使用axis
参数指定填充的轴:
1 2 3 4 5 6 |
>>>c.fillna(method='ffill', axis=1) 0 1 2 3 0 NaN NaN NaN NaN 1 -0.996363 -0.996363 -0.996363 -0.996363 2 0.913442 -1.162916 -1.162916 -1.162916 3 1.609045 1.420601 0.043001 0.353668 |
进一步使用limit
参数,可以规定填充的次数:
1 2 3 4 5 6 |
>>>c.fillna(method='ffill', axis=1, limit=2) 0 1 2 3 0 NaN NaN NaN NaN 1 -0.996363 -0.996363 -0.996363 NaN 2 0.913442 -1.162916 -1.162916 -1.162916 3 1.609045 1.420601 0.043001 0.353668 |
fillna()
方法创建的都是新的对象,也可以通过inplace
参数直接修改原对象:
1 2 3 4 5 6 7 |
>>>c.fillna(method='ffill', axis=1, limit=2, inplace=True) >>>c 0 1 2 3 0 NaN NaN NaN NaN 1 -0.996363 -0.996363 -0.996363 NaN 2 0.913442 -1.162916 -1.162916 -1.162916 3 1.609045 1.420601 0.043001 0.353668 |
原来的对象c
已经被修改了。
总结
缺失值处理在数据处理过程当中非常常见,熟练掌握这些方法可以大大增加工作效率。