图解pandas缺失值处理
Posted 尤尔小屋的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图解pandas缺失值处理相关的知识,希望对你有一定的参考价值。
公众号:尤而小屋
作者: Peter
编辑:Peter
数据清洗真的是一项复杂且繁琐的工作。有人嘲讽😭:搞数据的,80%的时间花在了数据清洗上。听起来匪夷所思的,但实际情况真的就是如此呀!
但也是整个数据分析过程中最为重要的一环。本篇文章将介绍如何使用Pandas库来处理缺失值。
Pandas系列
Pandas文章已经连载12篇,往期精选文章:
常用函数
当我们的数据中出现了空值或者缺失值之后,我们经常处理的函数有:判断是否是缺失值、直接删除缺失值、填充缺失值
- 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表示
df.isnull() # 空值的位置标记为True
查看每个列属性是否存在缺失值
df.isnull().any() # 只要有一个缺失值及为True
查看每个列属性存在多少缺失值
df.isnull().sum() # 每个列属性的缺失值总数
⚠️isna()和isnull()的用法相同:
查看非缺失值情况notnull()
notnull()和isnull()的用法是完全相反的:
1、查看每个非缺失值的情况,此时缺失值用False表示
2、查看每个列属性的非缺失值个数
删除缺失值dropna
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
有时候处理数据的时候,我们可以直接删除缺失值;但有时为了数据的完整性,我们需要对缺失值进行填充:
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).
模拟数据
再模拟一份数据:
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缺失值处理的主要内容,如果未能解决你的问题,请参考以下文章