python数据清洗,读取excel文件同时屏蔽不合理值为NaN
发布于 作者:苏南大叔 来源:程序如此灵动~目光集中在pandas
库,它可以读取excel
文件,返回dataframe
对象。在读取excel
文件的同时,实际上有个na_values
参数就可以对数据进行第一波清洗,这就是本文主要描述的事情。
大家好,这里是苏南大叔的“程序如此灵动”博客,这里讲述苏南大叔和计算机代码之间的故事。测试环境:python@3.12.3
,pandas@2.2.2
,numpy@1.26.4
,xlrd@2.0.1
,openpyxl@3.1.2
。
安装第三方库
读取.xls
文件,并非时pandas
自带的功能,需要个xlrd
的支持。否则会得到下面的错误提示信息:
ImportError: Missing optional dependency 'xlrd'. Install xlrd >= 2.0.1 for xls Excel support Use pip or conda to install xlrd.
读取.xlsx
文件的时候,使用的是另外一个openpyxl
库。缺少的时候,会提示错误:
ImportError: Missing optional dependency 'openpyxl'. Use pip or conda to install openpyxl.
解决方案:
pip install xlrd
pip install openpyxl
参考文章:
测试文件
这里有个test.xls
文件,有两个sheet
。内容如下图所示:
读取文件
pd.read_excel("test.xlsx")
输出:
id name job
0 1 苏南 NaN
1 2 大叔 NaN
2 3 大哥 CCTV
3 4 sunan
4 5 同学 007
5 6 大兄弟 MTV
列名都正确识别了,但是索引却有些问题。
索引序号 index_col
可以看到上面读取到的数据集是有点问题的。原数据里面是有索引数据的,但是函数有设置了一个新的索引。
pd.read_excel("test.xls", index_col=[0])
输出:
name job
id
1 苏南 NaN
2 大叔 NaN
3 大哥 CCTV
4 sunan
5 同学 007
6 大兄弟 MTV
不能指定索引列名,但是要指定数字第几个。如果指定多个数字的话,就会生成多重索引的dataframe
。但是这种很不常见。
过滤数据 na_values
这里可以看到,读到的数据存在着一些不合理数据,比如None
/NaN
等。包括007
这种,如果需要,也可以视为不合理值。
pd.read_excel("test.xls", index_col=[0],na_values=["NA",""," "," ","None","007"])
输出:
name job
id
1 苏南 NaN
2 大叔 NaN
3 大哥 CCTV
4 sunan NaN
5 同学 NaN
6 大兄弟 MTV
这里其实也不是能过滤所有的数据,特殊情况下还是使用其他的方式比如正则表达式等进行过滤比较合适。
参考文章:
- https://newsn.net/say/python-isnone.html
- https://newsn.net/say/python-isnan.html
- https://newsn.net/say/python-isspace.html
不转换None
这里有个特例,就是None
,即使不指定为na_values
,也会被转变为NaN
。解决方案是增加参数keep_default_na=False
。
pd.read_excel("test.xls", index_col=[0], keep_default_na=False, na_values=["NA",""," "," ","007"])
输出:
name job
id
1 苏南 None
2 大叔 NaN
3 大哥 CCTV
4 sunan NaN
5 同学 NaN
6 大兄弟 MTV
读取另外的sheet
默认情况下,读取的活动sheet
。如果要读取到其他的非活动sheet
,需要指定一下名称。比如:
pd.read_excel("test.xls", "Sheet2")
输出:
task
0 none
1 fake
读取csv
csv
文件虽然也是excel
的一种变形,但是它是使用pd.read_csv()
函数读取的。
pd.read_csv("test.csv")
参考文章:
使用pd.read_excel()
读取csv
文件的话,可能得到报错信息如下:
ValueError: Excel file format cannot be determined, you must specify an engine manually.
结语
当然,read_excel()
函数还有很多其他参数,暂时用不到。所以,待议。更多python
相关经验文章,请点击下面的链接:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。