在真实的数据中,往往会存在缺失的数据。pandas在设计之初,就考虑了这种缺失值的情况,默认情况下,大部分的计算函数都会自动忽略数据集中的缺失值,同时对于缺失值也提供了一些简单的填充和删除函数,常见的几种缺失值操作技巧如下
1. 默认的缺失值
当需要人为指定一个缺失值时,默认用None和np.nan来表示,用法如下
代码语言:javascript复制>>> import numpy as np
>>> import pandas as pd
# None被自动识别为NaN
>>> pd.Series([1, 2, None])
0 1.0
1 2.0
2 NaN
# np.nan被自动识别为NaN
>>> pd.Series([1, 2, np.nan])
0 1.0
1 2.0
2 NaN
dtype: float64
2. 缺失值的判断
为了针对缺失值进行操作,常常需要先判断是否有缺失值的存在,通过isna和notna两个函数可以快速判断,用法如下
代码语言:javascript复制>>> a = pd.Series([1, 2, None, 3])
>>> a
0 1.0
1 2.0
2 NaN
3 3.0
dtype: float64
# is.na 方法,如果为NaN, 返回True, 否则返回False
>>> a.isna()
0 False
1 False
2 True
3 False
dtype: bool
# notnat方法,如果为NaN, 返回False, 否则返回True
>>> a.notna()
0 True
1 True
2 False
3 True
dtype: bool
3. 缺失值的填充
通过fillna方法可以快速的填充缺失值,有两种填充方式, 用法如下
代码语言:javascript复制>>> a = pd.Series([1, 2, None, 3])
>>> a
0 1.0
1 2.0
2 NaN
3 3.0
dtype: float64
# value参数,表示用一个指定的值来替换缺失值
>>> a.fillna(value=1)
0 1.0
1 2.0
2 1.0
3 3.0
dtype: float64
# method参数,指定一种方法来填充缺失值
# pad方法,表示用NaN前面一个值来进行填充
>>> a.fillna(method = 'pad')
0 1.0
1 2.0
2 2.0
3 3.0
dtype: float64
# bfill法,表示用NaN后面一个值来进行填充
>>> a.fillna(method = 'bfill')
0 1.0
1 2.0
2 3.0
3 3.0
dtype: float64
fillna也可以对DataFrame进行操作,示意如下
代码语言:javascript复制>>> df = pd.DataFrame({'A':[1, 2, None], 'B':[1, np.nan, 3]})
>>> df
A B
0 1.0 1.0
1 2.0 NaN
2 NaN 3.0
# 对每一列的NaN值,依次用对应的均值来填充
>>> df.fillna(df.mean())
A B
0 1.0 1.0
1 2.0 2.0
2 1.5 3.0
4. 缺失值的删除
通过dropna方法来快速删除NaN值,用法如下
代码语言:javascript复制>>> a.dropna()
0 1.0
1 2.0
dtype: float64
# dropna操作数据框时,可以设置axis参数的值
# 默认为0,表示去除包含 了NaN的行
# axis=1,表示去除包含了NaN的列
>>> df = pd.DataFrame({'A':[1, 2, None], 'B':[1, np.nan, 3]})
>>> df
A B
0 1.0 1.0
1 2.0 NaN
2 NaN 3.0
>>> df.dropna()
A B
0 1.0 1.0
>>> df.dropna(axis=0)
A B
0 1.0 1.0
>>> df.dropna(axis=1)
Empty DataFrame
Columns: []
Index: [0, 1, 2]
pandas中的大部分运算函数在处理时,都会自动忽略缺失值,这种设计大大提高了我们的编码效率。同时,通过简单上述几种简单的缺失值函数,可以方便地对缺失值进行相关操作。