一个在IT行业摸爬打滚的程序猿

0%

【最便捷方法】pandas-处理缺失值

前言

最近看到一些教程关于“pandas读取数据之后,如何处理缺失值或者如何替换指定值为另外一个值”

看了那些教程,然后进行了一会实操,发现不能满足我的需求,于是开始探索另外的解决办法

下面来看一下解决方案

0x01、不设置默认加载空值为NAN keep_default_na=False
1
df = pandas.read_excel("/home/project/day320/test.xlsx", keep_default_na=False)

注释:pandas加载Excel表格,空值都是默认为 NAN,即源码中keep_default_na=True
所以当我们想要空值就是空值的话,那么可以设置 keep_default_na=False,这时候,读取出来的空值是空字符串

可是,我的Excel表格之前就是存在很多 NA 值的,这不能满足我的需求,我其实是想将 NA 值再还原回原来的空字符串,所以请继续看后面的方法

0x02、用dropna()、fillna()处理缺失值

存在下面的使用方法:

  • dropna:根据标签的值中是否存在缺失数据,然后对轴标签进行过滤,可以通过阈值来调节对缺失值的删除的容忍度

  • fillna:用指定值或者插值方法(如ffill或者bfill)填充缺失数据

  • isnull:用于判断单元格是否为空值;若为空值,则返回True

  • notnull:isnull的对立
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
删除空值:
df.dropna() # 默认会删除所有的空值,包含所有行里面的、所有列里面的空值

df.dropna(how="all") # 删除全为 NA 的行(即如果一整行的单元格都是NA的话,那么则删除这一行)

df.dropna(axis=1, how="all") # 删除全为 NA 的列(即如果一整列的单元格都是NA的话,那么则删除这一列)


判断空值:
df.isnull() # 对应的返回布尔值,查看是否为空的数据
df.notnull() # 与上一条相反

填充缺失值:
df.fillna(value=2, inplace=True) # 对缺失的NAN值全部替换为 0

df.fillna(value=2, method="ffill", limit=2)
- method:表示插值方式,默认为ffill,对这个字段更多详解请参考官网文档
- limit:表示可以连续填充的最大次数(对于前向和后向填充)
- value:需要填充的值,可以为标量(字符串、数值等)或者字典对象
- inspace:表示是否在原来的对象上进行修改而不产生新的对象,true:在原基础上修改;false:会返回处理后的,新的对象

==前方高能,巨坑提示==如果你的数据中其实看起来就是空值的,但是这时候有可能为 空白的字符串 那么,你使用fillna或者dropna是不会生效的!!!!

小结:对于一些不确定的,或者不一定为空的内容,还是不能直接使用这两个dropnafillna这两个来处理缺失值。
相关参考fillna和inplace使用文章,请点击我进行了解

0x03、使用强大的replace来填充任何值的数据

pandas提供了一个replace方法,并且这个方法==可以使用正则==来处理

1
2
3
4
5
6
df.replace(to_replace=r"^NA$", value="", inplace=True, regex=True)

- to_replace:被替换的字符
- value:替换后的字符
- inplace:是否在原基础上进行修改
- regex:是否为正则表达式方式

由于我的表格里面的空值都是写着NA的,所以对于我来说,使用这个方法是最好的一个实现办法

如果你的空白字符可能含有空格、换行、制表符等空白字符的话,可以使用这个正则来替换:

1
df.replace(to_replace=r"^\s*$", value="", inplace=True, regex=True)