一文速学-Pandas处理缺失值操作各类方法详解

360 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第18天,点击查看活动详情

前言

使用Pandas进行数据预处理时需要了解Pandas的基础数据结构Series和DataFrame。若是还不清楚的可以再去看看我之前的三篇博客详细介绍这两种数据结构的处理方法:

一文速学-数据分析之Pandas数据结构和基本操作代码

DataFrame行列表查询操作详解+代码实战

DataFrame多表合并拼接函数concat、merge参数详解+代码操作展示

以上三篇很容易学会,没有比较难的实战。此篇博客基于Jupyter之上进行演示,本篇博客的愿景是希望我或者读者通过阅读这篇博客能够学会方法并能实际运用,而且能够记录到你的思想之中。希望读者看完能够提出错误或者看法,博主会长期维护博客做及时更新。纯分享,希望大家喜欢。 此博客用到的数据集为:

缺失值处理

1.计数

isnull函数可以显示为空的值,使用False和True替换原数据集

df1.isnull()

图片.png

一般在加上sum()统计各个特征空值数:

df1.isnull().sum()

计数空值的话也可以通过info()函数对比其他列相减得到空值个数: 

df1.info()

 

135968-107759=28209就是空值的个数。

2.筛选

检测完毕后可以我们可以筛选出没有空值的行数据:

df1.loc[df1['city_num'].notnull(),:]

也可以使用dropna()函数对空值进行删除:

DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)

参数说明:

  • axis:指定的轴,默认为0也就是参照对每行进行操作,1就为列。
  • how:可以为any也可以为all,对整体或者部分进行操作。
  • thresh:一行或一列中至少出现了多少个空值才删除。
  • subset:在某些列的子集中选择出现了缺失值的列删除,不在子集中的含有缺失值得列或行不会删除(有axis决定是行还是列)
  • inplace:是否替换原数据集。
df1.dropna(axis=0,how='any',inplace=False)

3.填充

关于填充上偏文章有讲述过fillna()函数可以将空值统一替换为想要的数值(也可以设定为均值填充dataFrame.mean(),inplace = True、向上填充method=‘ffill’、向下填充method=‘bfill’、对应值填充df.replace({np.nan:‘aa’}))

DataFrame.fillna(value=None, method=None, axis=None, inplace=False, limit=None, downcast=None)

参数说明:

  • value:将空值替换成任意设定的值

  • method:method参数的取值 : {‘pad’, ‘ffill’,‘backfill’, ‘bfill’, None}, default None

  • ffill:用缺失值前面的一个值代替缺失值,如果axis =1,那么就是横向的前面的值替换后面的缺失值,如果axis=0,那么则是上面的值替换下面的缺失值。backfill/bfill,缺失值后面的一个值代替前面的缺失值。注意这个参数不能与value同时出现。

  • 向上填充method=‘ffill’、向下填充method=‘bfill’,

  • axis:指定改变的轴,默认为0也就是对每行操作。

  • inplace:是否替换原数据集。

  • limit参数:限制填充个数。

为方便展示这里另外创建数据集:

例如我想把年龄为空值的数据替换为10:

df2.loc[:,'old'].fillna(value=10,inplace=True)

 

填充为上一个数据:

df2.loc[:,'old'].fillna(method='ffill',inplace=True)

向下填充数据:

df2.loc[:,'old'].fillna(method='bfill',inplace=True)

填充为均值:

df2.loc[:,'old'].fillna(value=df2.loc[:,'old'].mean(),inplace=True)

 

填充为众数:

df2.loc[:,'old'].fillna(value=df2.loc[:,'old'].median(),inplace=True)

填充为最大值:

df2.loc[:,'old'].fillna(value=df2.loc[:,'old'].max(),inplace=True)

  填充为最小值:

df2.loc[:,'old'].fillna(value=df2.loc[:,'old'].min(),inplace=True)

 

点关注,防走丢,如有纰漏之处,请留言指教,非常感谢

以上就是本期全部内容。我是fanstuck ,有问题大家随时留言讨论 ,我们下期见