Python Pandas知识点之缺失值处理详解

前言

数据处理过程中,经常会遇到数据有缺失值的情况,本文介绍如何用Pandas处理数据中的缺失值。

一、什么是缺失值

对数据而言,缺失值分为两种,一种是Pandas中的空值,另一种是自定义的缺失值。

1. Pandas中的空值有三个:np.nan (Not a Number) 、 None 和 pd.NaT(时间格式的空值,注意大小写不能错),这三个值可以用Pandas中的函数isnull(),notnull(),isna()进行判断。

isnull()和notnull()的结果互为取反,isnull()和isna()的结果一样。对于这三个函数,只需要用其中一个就可以识别出数据中是否有空值。如果数据量较大,再配合numpy中的any()和all()函数就行了。

需要特别注意两点:

  • 如果某一列数据全是空值且包含pd.NaT,np.nan和None会自动转换成pd.NaT。
  • 空值(np.nan、None、pd.NaT)既不是空字符串"",也不是空格" "。

从Python解释器来看,np.nan的类型是float,None的类型是NoneType,两者在Pandas中都显示为NaN,pd.NaT的类型是Pandas中的NaTType,显示为NaT。而不管是空字符串还是空格,其数据类型都是字符串,Pandas判断的结果不是空值。

2. 自定义缺失值有很多不同的形式,如上面刚说的空字符串和空格(当然,一般不用这两个,因为看起来不够直观)。

在获取数据时,可能会有一些数据无法得到,也可能数据本身就没有,造成了缺失值。对于这些缺失值,在获取数据时通常会用一些符号之类的数据来代替,如问号?,斜杠/,字母NA等。

如果处理的数据是自己获取的,那自己知道缺失值是怎么定义的,如果数据是其他人提供的,一般会同时提供数据的说明文档,说明文档中会注明缺失值的定义方式。

对于自定义缺失值,不能用isnull()等三个函数来判断,不过可以用isin()函数来判断。找到这些值后,将其替换成np.nan,数据就只有空值一种缺失值了。

此外,在数据处理的过程中,也可能产生缺失值,如除0计算,数字与空值计算等。

二、判断缺失值

1. 自定义缺失值的判断和替换

isin(values): 判断Series或DataFrame中是否包含某些值,可以传入一个可迭代对象、Series、DataFrame或字典。在我们判断某个自定义的缺失值是否存在于数据中时,用列表的方式传入就可以了。

replace(to_replace=None, value=None): 替换Series或DataFrame中的指定值,一般传入两个参数,to_replace为被替换的值,value为替换后的值。to_replace和value不仅支持Python中的整型、字符串、列表、字典等,还支持正则表达式。

使用replace()时,默认返回原数据的一个副本,replace()中的inplace参数默认为False,将inplace参数修改为True,则会修改数据本身。其他参数这里就不展开了,有需要可以自己添加。

其实replace()函数已经可以用于缺失值的填充处理了,直接一步到位,而不用先替换成空值再处理。当然,先替换成空值,可以与空值一起处理。

2. 空值判断

isnull(): 判断Series或DataFrame中是否包含空值,与isna()结果相同,与notnull()结果相反。返回结果是一个与原数据形状相同的Series或DataFrame。

如果数据很多,我们不可能肉眼观察返回结果中的布尔值,所以需要借助numpy中的any()函数或all()函数,进一步对结果进行判断。

三、删除缺失值

dropna(axis=0, how="any", thresh=None, subset=None, inplace=False): 删除Series或DataFrame中的空值。

axis: axis参数默认为0('index'),按行删除,即删除有空值的行。将axis参数修改为1或‘columns',则按列删除,即删除有空值的列。在实际的应用中,一般不会按列删除,例如数据中的一列表示年龄,不能因为年龄有缺失值而删除所有年龄数据。

how: how参数默认为any,只要一行(或列)数据中有空值就会删除该行(或列)。将how参数修改为all,则只有一行(或列)数据中全部都是空值才会删除该行(或列)。

thresh: 表示删除空值的界限,传入一个整数。如果一行(或列)数据中少于thresh个非空值(non-NA values),则删除。​也就是说,一行(或列)数据中至少要有thresh个非空值,否则删除。

subset: 删除空值时,只判断subset指定的列(或行)的子集,其他列(或行)中的空值忽略,不处理。当按行进行删除时,subset设置成列的子集,反之。

inplace: 默认为False,返回原数据的一个副本。将inplace参数修改为True,则会修改数据本身。

删除缺失值,必然会导致数据量的减少,如果缺失值占数据的比例较大,比如超过了数据的10%(具体标准根据项目来定),删除数据对数据分析的结果会有很大的影响,不合理。

四、填充缺失值

fillna(value=None, method=None, axis=None, inplace=False, limit=None): 填充Series或DataFrame中的空值。

value: 表示填充的值,可以是一个指定值,也可以是字典, Series或DataFrame。

method: 填充的方式,默认为None。有 ffill,pad,bfill,backfill 四种填充方式可以使用,ffill 和 pad 表示用缺失值的前一个值填充,如果axis=0,则用空值上一行的值填充,如果axis=1,则用空值左边的值填充。假如空值在第一行或第一列,以及空值前面的值全都是空值,则无法获取到可用的填充值,填充后依然保持空值。bfill 和 backfill 表示用缺失值的后一个值填充,axis的用法以及找不到填充值的情况同 ffill 和 pad 。

注意:当指定填充方式method时,不能同时指定填充值value,否则报错。

axis: 通常配合method参数使用,axis=0表示按行,axis=1表示按列。

limit: 表示填充执行的次数。如果是按行填充,则填充一行表示执行一次,按列同理。

在缺失值填充时,填充值是自定义的,对于数值型数据,最常用的两种填充值是用该列的均值和众数。DataFrame的众数也是一个DataFrame数据,众数可能有多个(极限情况下,当数据中没有重复值时,众数就是原DataFrame本身),所以用mode()函数求众数时取第一行用于填充就行了。

除了可以在fillna()函数中传入method参数指定填充方式外,Pandas中也实现了不同填充方式的函数,可以直接调用。

pad(axis=0, inplace=False, limit=None): 用缺失值的前一个值填充。

ffill(): 同pad()。

bfill(): 用缺失值的后一个值填充。

backfill(): 同bfill()。

在进行数据填充时,可能填充之后还有空值,如用ffill 和 pad填充时,数据第一行就是空值。对于这种情况,需要在填充前人工进行判断,避免选择不适合的填充方式,并在填充完成后,再检查一次数据中是否还有空值。

总结

到此这篇关于Python Pandas知识点之缺失值处理的文章就介绍到这了,更多相关Pandas缺失值处理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python Pandas找到缺失值的位置方法

    问题描述: python pandas判断缺失值一般采用 isnull(),然而生成的却是所有数据的true/false矩阵,对于庞大的数据dataframe,很难一眼看出来哪个数据缺失,一共有多少个缺失数据,缺失数据的位置. 首先对于存在缺失值的数据,如下所示 import pandas as pd import numpy as np df = pd.DataFrame(np.random.randn(10,6)) # Make a few areas have NaN values df.

  • 简单了解Pandas缺失值处理方法

    这篇文章主要介绍了简单了解Pandas缺失值处理方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 判断数据是否为NaN: pd.isnull(df), pd.notnull(df) 判断缺失值是否存在 np.all(pd.notnull(data)) # 返回false代表有空值 np.any(pd.isnull(data)) #返回true代表有空值 处理方式: 存在缺失值nan,并且是np.nan: 1.删除缺失值:dropna(axis

  • 对Pandas DataFrame缺失值的查找与填充示例讲解

    查看DataFrame中每一列是否存在空值: temp = data.isnull().any() #列中是否存在空值 print(type(temp)) print(temp) 结果如下,返回结果类型是Series,列中不存在空值则对应值为False: <class 'pandas.core.series.Series'> eventid False iyear False imonth False iday False approxdate True extended False reso

  • pandas 使用均值填充缺失值列的小技巧分享

    pd.DataFrame中通常含有许多特征,有时候需要对每个含有缺失值的列,都用均值进行填充,代码实现可以这样: for column in list(df.columns[df.isnull().sum() > 0]): mean_val = df[column].mean() df[column].fillna(mean_val, inplace=True) # -------代码分解------- # 判断哪些列有缺失值,得到series对象 df.isnull().sum() > 0

  • pandas中read_csv的缺失值处理方式

    今天遇到的问题是,要将一份csv数据读入dataframe,但某些列中含有NA值.对于这些列来说,NA应该作为一个有意义的level,而不是缺失值,但read_csv函数会自动将类似的缺失值理解为缺失值并变为NaN. 看pandas文档中read_csv函数中这两个参数的描述,默认会将'-1.#IND', '1.#QNAN', '1.#IND', '-1.#QNAN', '#N/A N/A','#N/A', 'N/A', 'NA', '#NA', 'NULL', 'NaN', '-NaN', '

  • pandas 缺失值与空值处理的实现方法

    1.相关函数 df.dropna() df.fillna() df.isnull() df.isna() 2.相关概念 空值:在pandas中的空值是"" 缺失值:在dataframe中为nan或者naT(缺失时间),在series中为none或者nan即可 3.函数具体解释 DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False) 函数作用:删除含有空值的行或列 axis:维度,axis=

  • Python Pandas对缺失值的处理方法

    Pandas使用这些函数处理缺失值: isnull和notnull:检测是否是空值,可用于df和series dropna:丢弃.删除缺失值 axis : 删除行还是列,{0 or 'index', 1 or 'columns'}, default 0 how : 如果等于any则任何值为空都删除,如果等于all则所有值都为空才删除 inplace : 如果为True则修改当前df,否则返回新的df fillna:填充空值 value:用于填充的值,可以是单个值,或者字典(key是列名,valu

  • pandas如何处理缺失值

    在实际应用中对于数据进行分析的时候,经常能看见缺失值,下面来介绍一下如何利用pandas来处理缺失值.常见的缺失值处理方式有,过滤.填充. 一.缺失值的判断 pandas使用浮点值NaN(Not a Number)表示浮点数和非浮点数组中的缺失值,同时python内置None值也会被当作是缺失值. a.Series的缺失值判断 s = Series(["a","b",np.nan,"c",None]) print(s) ''' 0 a 1 b 2

  • python解决pandas处理缺失值为空字符串的问题

    踩坑记录: 用pandas来做csv的缺失值处理时候发现奇怪BUG,就是excel打开csv文件,明明有的格子没有任何东西,当然,我就想到用pandas的dropna()或者fillna()来处理缺失值. 但是pandas读取csv文件后发现那个空的地方isnull()竟然是false,就是说那个地方有东西... 后来经过排查发现看似什么都没有的地方有空字符串,故pandas认为那儿不是缺失值,所以就不能用dropna()或者fillna()来处理. 解决思路:先用正则将空格匹配出来,然后全部替

  • Pandas缺失值2种处理方式代码实例

    处理方式: 存在缺失值nan,并且是np.nan: 删除存在缺失值的:dropna(axis='rows') 替换缺失值:fillna(df[].mean(), inplace=True) 不是缺失值nan,有默认标记的 1.存在缺失值nan,并且是np.nan # 判断数据是否为NaN # pd.isnull(df),pd.notnull(df),pd.isna(df) # 读取数据 movie = pd.read_csv("./date/IMDB-Movie-Data.csv")

随机推荐