Pandas学习笔记 07 缺失数据
第七章 缺失数据 总结
1 缺失值的统计和删除
1.1 缺失信息统计 isna/isnull
isna/isnull
用于查看单元格缺失情况,缺失返回True
,否则返回False
。
利用Series
上的isna
或者notna
进行布尔索引,可以查看某一列缺失或非缺失的行。
与any, all
组合,可以查看至少一个/全部
缺失/没有缺失
的行。
df.isna().mean() # 查看缺失比例
df[sub_set.isna().any(1)].head() # 至少有一个缺失
1.2 缺失信息的删除dropna
dropna
的主要参数为轴方向默认axis=0
、删除方式how='any/all'
、删除的非缺失值个数阈值thresh
(非缺失值数量小于阈值的相应维度会被删除)、备选的删除子集subset
。
df.dropna(how='any', subset=['Height', 'Weight']) # 删除身高体重至少有一个缺失的行
df.dropna(axis=1, thresh=df.shape[0]-15) # 删除缺失值超过15个的列
2 缺失值的填充和插值
2.1 利用fillna
进行填充
fillna
三个常用参数:
value
为填充值,可以是标量、字典、序列或DataFrame
method
为填充方式,包括用前值填充ffill
和后值填充bfill
。limit
表示连续缺失值的最大填充次数
s.fillna(method='ffill', limit=1)
# 根据年级进行身高的均值填充,先分组再transform
df.groupby('Grade')['Height'].transform(lambda x:x.fillna(x.mean()))
2.2 插值函数interpolate
interpolate
三个常用参数:
method
插值方法,默认为linear
线性插值limit_direction
限制插值方向,默认为前向forward
,后向为backward
,双向为both
limit
控制最大连续缺失值插值个数
最近邻插补:nearest
,使用最近的非缺失值元素填充。
索引插值:根据索引大小进行线性插值,method='index'
。
s.interpolate(limit_direction='both', limit=1) # 双向插值
s.interpolate('nearest') # 最近邻插值
# 和索引有关的线性插值,计算相应索引大小对应的值
s.interpolate(method='index')
3 Nullable
类型
3.1 缺失记号及其缺陷
在python
中缺失值用None
表示,该元素与除自身外的其他任何元素不相等。
在numpy
中缺失值用np.nan
来表示,该元素除了不和其他任何元素相等之外,和自身的比较结果也返回False
,但使用equals函数时两缺失值位置返回True。
由于np.nan
为浮点型,与时间类型混合存储会变成object
混杂类型,因此,在时间序列的对象中,pandas
利用pd.NaT
来指代缺失值。
3.2 Nullable
类型的性质
包含 Nullable
的序列类型不受缺失值的影响,自动转换为pandas
内置的pd.NA
。三种Nullable
序列类型分别是Int, boolean
和string
。
-
在
Int
的序列中,返回的结果会尽可能地成为Nullable
的类型; -
boolean
和bool
类型序列的行为主要有两点区别:- 带有缺失的布尔列表无法进行索引器中的选择,而
boolean
会把缺失值看作False
。 - 逻辑运算时,
bool
类型在缺失处返回False
,而boolean
会根据逻辑运算是否能确定唯一结果来返回相应的值。
- 带有缺失的布尔列表无法进行索引器中的选择,而
3.3 缺失数据的计算和分组
调用函数sum, prod
运算时,缺失数据分别被视作0和1。
调用累计函数运算时,会自动跳过缺失值所处的位置。
单个标量运算时,除了np.nan ** 0
和1 ** np.nan
运算结果为1.0,其余均为缺失(pd.NA
与此一致)。
np.nan
在比较操作时一定返回False
,而pd.NA
返回pd.NA
。
df_nan = pd.DataFrame({'category':['a','a','b',np.nan,np.nan], 'value':[1,3,5,7,9]})
df_nan.groupby('category', dropna=False)['value'].mean()