前言
最近看到一些教程关于“pandas读取数据之后,如何处理缺失值或者如何替换指定值为另外一个值”
看了那些教程,然后进行了一会实操,发现不能满足我的需求,于是开始探索另外的解决办法
下面来看一下解决方案
0x01、不设置默认加载空值为NAN keep_default_na=False
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的对立
删除空值:
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 是不会生效的!!!!
小结:对于一些不确定的,或者不一定为空的内容,还是不能直接使用这两个dropna 、fillna 这两个来处理缺失值。
相关参考fillna和inplace使用文章,请点击我进行了解
0x03、使用强大的replace 来填充任何值的数据
pandas提供了一个replace方法,并且这个方法==可以使用正则==来处理
df.replace(to_replace=r"^NA$", value="", inplace=True, regex=True)
- to_replace:被替换的字符
- value:替换后的字符
- inplace:是否在原基础上进行修改
- regex:是否为正则表达式方式
由于我的表格里面的空值都是写着NA的,所以对于我来说,使用这个方法是最好的一个实现办法
如果你的空白字符可能含有空格、换行、制表符等空白字符的话,可以使用这个正则来替换:
df.replace(to_replace=r"^\s*$", value="", inplace=True, regex=True)
|