Fork me on GitHub

图解pandas的缺失值处理

图解Pandas缺失值空值处理

数据清洗真的是一项复杂且繁琐的工作,但也是整个数据分析过程中最为重要的环。

搞数据的,80%的时间花在了数据清洗上。听起来匪夷所思的,但实际情况真的就是如此呀!

本篇文章将介绍几种常见的使用Pandas库处理缺失值的方法。

Pandas系列

Pandas文章已经连载12篇,往期精选文章:

1-图解pandas的排序机制

2-图解pandas的排名机制

3-图解pandas的groupby机制

常用函数

当我们的数据中出现了空值或者缺失值之后,我们经常处理的函数有:判断是否是缺失值、直接删除缺失值、填充缺失值

  • df.isnull()、df.notnull():两个函数互为取反
  • df.isna():等同于df.isnull()
  • df.dropna():删除缺失值
  • df.fillna():填充缺失值

相关概念

首先介绍下Pandas或者Python涉及到的几个可能模糊的概念:

  • 空值在pandas中的空值是""(直接一对双引号);空字符串:" ",中间多了一个空格
  • 缺失值在DataFrame指的是NaN或者NaT,在Series中指的是none或者nan
  • 当我们需要人为指定一个缺失值的时候,默认用None和np.nan来表示

其次,我们看看Pandas中None和NaN的关联:

  • 在我们创建的时候,默认二者是相同的
  • 如果我们指定赋值为None,在Series中依然会变成none,并且是以float64的数据类型显示

模拟数据

为了进行解释,笔者模拟了一份存在缺失值和空值的数据:

在生日、地址、英语中存在缺失值;在地址中还存在空值:直接按下空格键即可生成

我们将数据读取到notebook的样子为下图:空值没有任何内容,缺失值显示为NaN或者NaT。

查看缺失值

两个函数可以查看数据中是否存在缺失值:isnull()、isna()

查看每个位置的缺失值情况

存在缺失值的位置会用True表示

1
df.isnull()  # 空值的位置标记为True

查看每个列属性是否存在缺失值

1
df.isnull().any() # 只要有一个缺失值及为True

查看每个列属性存在多少缺失值

1
df.isnull().sum()   # 每个列属性的缺失值总数

⚠️:isna()和isnull()的用法相同:

查看非缺失值情况notnull()

notnull()和isnull()的用法是完全相反的:

1、查看每个非缺失值的情况,此时缺失值用False表示

2、查看每个列属性的非缺失值个数

删除缺失值dropna

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

参数说明

参数的具体解释为:

  • axis:删除的行或者列,axis=0表示index索引方向;axis=1表示columns列;默认为0
  • how:“all”,“any”;all:表示行或者列全部缺失才删除(全部),any:表示只要有一个(至少)就删除,默认情况
  • thresh:一行或者一列中至少出现多少个不会删除
  • subset:只针对指定的列的子集进行删除;不在子集中的行或者列不进行操作
  • inplace:表示在生成一个新的DataFrame,还是直接在原数据上进行删除

为了解释方便,我们先生成一个副本df1:

参数axis

默认是axis=0的删除:

除了用axis=0或者axis=1表示之外,还可用axis="index"或者axis=“columns”:

参数how

两种方式进行删除:

  • how=“any”:至少有一个缺失值就删除,默认方式
  • how=“all”:全部是缺失值删除

参数thresh

thresh参数表示的是:thresh=N,当存在至少N个不缺失值的情况下,才会保留数据。

下面的例子中,N=6表示至少要有6个非缺失值才会保留;索引为1的数据存在两个缺失值,索引 被删除了

当我们改成N=7:只要存在缺失值的行都会被删除

参数subset

subset表示的使用指定通过某个子集元素来进行删除。可以是一个或者多个,多个使用列表形式

参数inplace

删除过缺失值得新数据是存为副本还是直接在原数据上进行修改。

如果不指定inplace,默认是存为副本,生成新的数据帧

如果指定为True,则原数据直接修改:

缺失值填充fillna

有时候处理数据的时候,我们可以直接删除缺失值;但有时为了数据的完整性,我们需要对缺失值进行填充:

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

参数解释

  • value:填充的值,可以是具体某个值,也可以用字典形式,或者函数计算出来的值等
  • axis:填充的方向,axis=0(行),默认;axis=1(列)
  • method:填充的方法{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, 默认是 None
  • inplace:生成新的副本还是原数据直接修改
  • limit:缺失值填充个数
  • downcast:数据类型的降低,item-> dtype的字典,如果可能的话,将向下转换,或者是字符串“infer”,将尝试向下转换为适当的相等类型。看下官网解释,用的少

downcast:A dict of item->dtype of what to downcast if possible, or the string ‘infer’ which will try to downcast to an appropriate equal type (e.g. float64 to int64 if possible).

模拟数据

再模拟一份数据:

1
2
3
4
5
6
df2 = pd.DataFrame([[np.nan, 2, np.nan, 0],
[3, 4, np.nan, 1],
[np.nan, np.nan, np.nan, 5],
[np.nan, 3, np.nan, 4]],
columns=list("ABCD"))
df2

参数value

参数value是我们需要填充的值,有多种形式:

通过字典的形式进行填充,字典的键是我们的列属性名称:

通过函数计算出来的值进行填充:

参数axis

axis参数用来表示填充的方向,默认是axis=0

参数limit

参数limit表示的是缺失值的最多填充个数:下面的例子是最多填充2个

参数method

参数method表示的是填充的方式,这个参数不能和value值同时存在

  • ffill、pad:用缺失值前一个值填充
  • bfill、backfill:用缺失值后一个数值填充

bfill和backfill表示的是用缺失值的后面一个值来进行填充当前缺失值的位置:比如索引为0的缺失值,后面是3,填充即可。

参数Inplace

作用效果类似dropna;如果加上inplace=True,则会直接修改原数据。不多介绍,一般我们都是默认用False,不直接修改原数据

参数downcast

为了解释downcast的使用,在Stack Overflow上找到了一个案例:

https://stackoverflow.com/questions/27066412/using-fillna-downcast-and-pandas

总结

数据不可能总是那么的完美,存在缺失值是十分常见的情况。本文从查看缺失值、删除缺失值到缺失值的填充进行详解地介绍,重点掌握dropna和fillna的使用,希望对读者有所帮助。

本文标题:图解pandas的缺失值处理

发布时间:2021年07月07日 - 09:07

原始链接:http://www.renpeter.cn/2021/07/07/%E5%9B%BE%E8%A7%A3pandas%E7%9A%84%E7%BC%BA%E5%A4%B1%E5%80%BC%E5%A4%84%E7%90%86.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Coffee or Tea