段丞博:使用Pandas处理excel文件-(1)动机和资源
段丞博:使用Pandas处理excel文件-(2)DataFrame和相关概念
段丞博:使用Pandas处理excel文件-(3)从Python默认数据类型中产生DataFrame
段丞博:使用Pandas处理excel文件-(4)读写excel表格
段丞博:使用Pandas处理excel文件-(5)访问DataFrame中的数据
段丞博:使用Pandas处理excel文件-(6)筛选DataFrame中满足特定条件的数据
段丞博:使用Pandas处理excel文件-(7)删除、增添行列或标签
段丞博:使用Pandas处理excel文件-(8)pandas中处理日期的四种基本数据类型介绍
段丞博:使用Pandas处理excel文件-(9)日期的处理
段丞博:使用Pandas处理excel文件-(10)数据处理
pandas在对excel处理上使用了已有的一些python库,这里只关注读excel文件的两个操作,一个是readexcel,它是用来直接读取excel文件的。另外一个是ExcelFile类,它主要参与上下文管理。而写文件,通用使用DataFrame的方法to_excel实现。
读取excel文件需要预处理的问题
在读写excel文件时,我们要考虑的一些问题。
读取excel文件
无论直接使用read_excel,还是ExcelFile进行上下文管理,都可以实现对直接或者部分读取excel文件。假设有下面的名为"e1.xlsx"的文件,里面包含了两个sheets,一个叫"A1",一个叫"A2",内容分别如下所示。
在只提供默认路径的情况下,直接用read_exce读取效果如下。
可以看到只读了文件中的表格"A1",如果用ExcelFile上下文管理读取,情况是类似的:
那这是不是说没在默认情况下,两种方法都只读了第一个表格呢?对于第二种情况,其实已经把表格"A2"也一并读入,只是在没有指定显示哪个表格时,默认显示第一个表格。变量e1自带的属性sheet_names说明了这一点。
而直接使用read_excel,在默认的条件下,只读取第一个表格。
如果想直接用readexcel读出所有的表格,可在设置参数sheet_name=None来实现,具体如下。
从结果可以看出,这时两个表格以字典的形式返回,字典中每个键值对应sheet在excel文件中的名字。
除此之外,如果文件中的表格很多,也可以用sheet_name读取多张指定的表格,由于这里只有两个表格,以读取第二张表格为例说明,示意如下。
对于sheet_name,无论是用表格的名称“A2”还是,它在excel文件中处于编号为1(第二个,python从0开始计数),都可以正确读取相应的表格。利用ExcelFile的操作是类似的,区别仅仅在于它一次性读入所有表格。
读取指定列
对于每一个表格,也许在某次处理中,并不需要所有数据,只需要读取特定的列,这时候,可以用参数usecols指定,例如考虑读取"A1"表格中的姓名和职业两列。
参数usecols中,列的顺序是无关紧要的,即usecols=[1,3]和[3,1]效果是一样的,安装表格中的顺序输出。当然也可以用列标签来读取,如下。
甚至可以用表格在Excel中的列标号来读取,如图“职业”和“姓名”对应的字母是"BD"那么
也是成立的,甚至可以用"C:F"这样的格式表示从“C”列读取至“F”列。
表格第一行的处理
在段丞博:使用Pandas处理excel文件-(2)DataFrame和相关概念的内容中介绍过从excel文件中读取表格时,对于表格第一行的默认处理。表头的实际情况通常是非常多样的,很多时候只靠一行是无法对数据的种类进行区分,所以在Pandas有MultiIndex的概念,对应高维数组。这里仅考虑如何对表格第一行进行处理,使用header指定表格第一行是否作为列标签处理,效果如下。
图中的第一次操作,header=0,和默认的效果一样,即第一行作为列标签。如果header=None,即整个表格作为数据读取,pandas自动用序号作为列标签。
这里自然就有另外的问题,如果header=1,或者header=[0,1,2]又会是什么含义呢?如果header仅仅为整数,那么含义就是让这一行称为列标签,如果是列表,包含多个整数,它的含义是这几行都是列标签,这涉及到高维数组,这里就不解释了。
列标签
通常的excel表格不会专门用一列固定作为行标签使用,因此在默认的情况下,pandas总是自己给表格加上从0计数的行标签。如果在读取excel表格时,需要指定某一列内容作为行标签使用,可以用index_col设定,如下指定了姓名这一列作为行标签使用。
对读入数据的特殊处理
将读入的数据以一定的方式处理称为解析(parser),当然这样的处理很宽泛。我们使用excel最直接的经验是某些列是数字,但是混入了字符格式;某个字符格式是id,结果被识别成了整数;一串字符应该以日期的方式呈现等等,这都需要对数据进行解析,或者说处理。而这些需求是多种多样的,pandas提供了多种方式处理。
这里举一个最简单的例子,通常我们需要表格中每一列的数据类型应该是保持一致的,这样才能和相应的标签呼应。例如性别一栏,肯定是字符“男”或者“女”,如果混入了其它内容显然是不合适的。同样如果有身份证一栏,我们希望以字符串的格式读入,而不是整数,因为一些身份证号中含有字母。因此如果对一列整体处理的话,可以用dtype来实现。以上面的表格为例,年龄以浮点数的方式读入,如下。
写入文件要相对简单很多,如果将DataFrame直接写入excel可使用to_excel函数实现,如果有多个表格写入同一个文件,可以用ExcelWriter实现,这一点就不再总结了。
在打开excel文件时,除了上述内容外,还存在许多其他需要处理的内容,例如表格中是否有空行,是否有注释行,一些不合理数据如何处理等等。这些问题在数据量特别大的时候,很可能成为数据预处理中最繁琐的事情,而对于日常使用,这些并不是太大的问题,如果需要可以参考pandas的手册。
上一篇
道教法器在宗教仪式中的意义: (1)鼓,通神及辟邪之用及醒人振奋的传讯工具。醮坛多用、扁平手鼓等法器。晨钟暮鼓原道门 ...
苹果在美国和加拿大地区推出了通过卫星通信实现的紧急求助 SOS 服务。虽然这项功能是为了在真正紧急情况下使用,但苹果用户 ...