pandas对象中表现缺失值的方式并不完美,但是它对大部分用户来说是有用的。对于数值型数据,pandas使用浮点值NaN(Not a Number来表示缺失值)。我们称NaN为容易检测到的标识值:
In :
- string_data = pd.Series(['aardvark', 'artichoke', np.nan, 'avocado'])
- string_data
Out:
- 0 aardvark
- 1 artichoke
- 2 NaN
- 3 avocado
- dtype: object
In:
- string_data.isnull()
Out:
- 0 False
- 1 False
- 2 True
- 3 False
- dtype: bool
在pandas中,我们采用了R语言中的编程惯例,将缺失值成为NA,意思是not available(不可用)。在统计学应用中,NA数据可以是不存在的数据或者是存在但不可观察的数据(例如在数据收集过程中出现了问题)。当清洗数据用于分析时,对缺失数据本身进行分析以确定数据收集问题或数据丢失导致的数据偏差通常很重要。
Python内建的None值在对象数组中也被当作NA处理:
In:
- string_data[0] = None
- string_data.isnull()
Out:
- 0 True
- 1 False
- 2 True
- 3 False
- dtype: bool
pandas项目持续改善处理缺失值的内部细节,但是用户API函数,比如pandas. isnull,抽象掉了很多令人厌烦的细节。处理缺失值的相关函数列表如下:
- dropna:根据每个标签的值是否是缺失数据来筛选轴标签,并根据允许丢失的数据量来确定阈值
- fillna:用某些值填充缺失的数据或使用插值方法(如“ffill”或“bfill”)。
- isnull:返回表明哪些值是缺失值的布尔值
- notnull:isnull的反作用函数
01 过滤缺失值
有多种过滤缺失值的方法。虽然你可以使用pandas.isnull和布尔值索引手动地过滤缺失值,但dropna在过滤缺失值时是非常有用的。在Series上使用dropna,它会返回Series中所有的非空数据及其索引值:
In:
- from numpy import nan as NA
- data = pd.Series([1, NA, 3.5, NA, 7])
- data.dropna()
Out:
- 0 1.0
- 2 3.5
- 4 7.0
- dtype: float64
上面的例子与下面的代码是等价的:
In:
- data[data.notnull()]
Out:
- 0 1.0
- 2 3.5
- 4 7.0
- dtype: float64
当处理DataFrame对象时,事情会稍微更复杂一点。你可能想要删除全部为NA或包含有NA的行或列。dropna默认情况下会删除包含缺失值的行: