使用Pandas处理excel文件-(4)读写excel表格

段丞博:使用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文件时,我们要考虑的一些问题。

  1. 每个excel文件包含多个表格(sheet),如何读取一个或者多个表格;
  2. 每个表格中读取哪些列;
  3. 是否使用数据第一行作为列标签,第一行是否是正式内容;
  4. 是否需要指定行的标签;
  5. 是否要对读取的数据提前进行处理,例如字符串日期之间的转换。

读取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来实现。以上面的表格为例,年龄以浮点数的方式读入,如下。

(二)写excel表格

写入文件要相对简单很多,如果将DataFrame直接写入excel可使用to_excel函数实现,如果有多个表格写入同一个文件,可以用ExcelWriter实现,这一点就不再总结了。

在打开excel文件时,除了上述内容外,还存在许多其他需要处理的内容,例如表格中是否有空行,是否有注释行,一些不合理数据如何处理等等。这些问题在数据量特别大的时候,很可能成为数据预处理中最繁琐的事情,而对于日常使用,这些并不是太大的问题,如果需要可以参考pandas的手册。

发表回复

相关推荐

软考超全扫盲贴!变身软考大神,看这篇就够了

这是一篇说人话、看得懂的文章。 从软考小白到软考大神,看这篇就够了。 先声明一点,不懂不要考,报名费一百多块钱呢,拿去 ...

· 51秒前

常说道家法器,但你真的有了解过吗?带你认识道家十四法器!(细节科普)

道教法器在宗教仪式中的意义: (1)鼓,通神及辟邪之用及醒人振奋的传讯工具。醮坛多用、扁平手鼓等法器。晨钟暮鼓原道门 ...

· 52秒前

苹果 iPhone14 系列的Find My功能通过卫星实现位置共享

苹果在美国和加拿大地区推出了通过卫星通信实现的紧急求助 SOS 服务。虽然这项功能是为了在真正紧急情况下使用,但苹果用户 ...

· 3分钟前

馬達京全攻略|我有不得不去的N個理由

從馬達京回來後,我依然忘不瞭退潮後,一條 白沙 橋逐漸顯露出來散發著陽光沐浴後味道的拖尾沙灘;5米淺灘之後垂直落下600至7...

· 3分钟前

職場小白工作中遇到的6個難題,如何高效解決?

1.領導關註的不是你的能力,而是你完成工作的效率和質量。2.看待問題時,不是哪裡有問題,而是哪裡對自己有感悟。3.制定目標...

· 5分钟前