缺失值的统计和删除
缺失信息的统计
缺失数据可以使用 isna 或 isnull (两个函数没有区别)来查看每个单元格是否缺失,结合 mean 可以计算出每列缺失值的比例
df.isna().mean()
# 如果想要查看某一列缺失或者非缺失的行,
# 可以利用 Series 上的 isna 或者 notna 进行布尔索引。
df[df.Height.isna()]
#如果想要同时对几个列,检索出全部为缺失或者至少有一个缺失或者
#没有缺失的行,可以使用 isna, notna 和 any, all 的组合
df[sub_set.isna().all(1)]
df[sub_set.isna().any(1)].head()
df[sub_set.notna().all(1)].head() # 没有缺失
缺失信息的删除
dropna 的主要参数为轴方向 axis (默认为0,即删除行)、删除方式 how 、删除的非缺失值个数阈值 thresh ( 非缺失值 没有达到这个数量的相应维度会被删除)、备选的删除子集 subset ,其中 how 主要有 any 和 all 两种参数可以选择。
删除超过15个缺失值的列
res = df.dropna(1, thresh=df.shape[0]-15) # 身高被删除
#等同于
res = df.loc[:, ~(df.isna().sum()>15)]
缺失值的填充和插值
在 fillna 中有三个参数是常用的: value, method, limit 。其中, value 为填充值,可以是标量,也可以是索引到元素的字典映射; method 为填充方法,有用前面的元素填充 ffill 和用后面的元素填充 bfill 两种类型, limit 参数表示连续缺失值的最大填充次数。
s.fillna({'a': 100, 'd': 200}) # 通过索引映射填充的值
s.fillna(s.mean()) # value为标量
s.fillna(method='ffill', limit=1)
有时为了更加合理地填充,需要先进行分组后再操作。例如,根据年级进行身高的均值填充:
df.groupby('Grade')['Height'].transform(
....: lambda x: x.fillna(x.mean())).head()
对于 interpolate 而言,除了插值方法(默认为 linear 线性插值)之外,有与 fillna 类似的两个常用参数,一个是控制方向的 limit_direction ,另一个是控制最大连续缺失值插值个数的 limit 。其中,限制插值的方向默认为 forward ,这与 fillna 的 method 中的 ffill 是类似的,若想要后向限制插值或者双向限制插值可以指定为 backward 或 both 。
没看懂的 s.interpolate('nearest').values 为什么填出来是这样?不是距离最近的点吗?
索引插值,即根据索引大小进行线性插值。例如,构造不等间距的索引进行演示:
In [36]: s.interpolate(method='index') # 和索引有关的线性插值,计算相应索引大小对应的值
Out[36]:
0 0.0
1 1.0
10 10.0
dtype: float64