解决Pandas生成Excel时的sheet问题的方法总结
作者:古明地觉 发布时间:2021-01-13 14:24:44
楔子
估计有不少小伙伴在将 DataFrame 导入到 Excel 的时候,都遇到过下面这种尴尬的情况:
想将多个 DataFrame 导入到一个 Excel 文件的多个 sheet 中,但是却发现生成的 Excel 文件里面只有最后一个 sheet;
想给一个现有的 Excel 文件追加一个 sheet,结果发现其它的 sheet 都没了,只剩下新追加的 sheet;
那么下面就来看看如何解决这些问题。
同时导入多个 sheet
如果想导入多个 sheet,那么肯定不能使用原来 to_excel("文件名") 的方式,那样只会保留最后一个 sheet。我们应该使用类 ExcelWriter 实现:
import pandas as pd
df1 = pd.DataFrame({"a": [1, 2], "b": [3, 4]})
df2 = pd.DataFrame({"a": [2, 3], "b": [4, 5]})
df3 = pd.DataFrame({"a": [3, 4], "b": [5, 6]})
# 调用pd.ExcelWriter, 需要指定mode="a", engine="openpyxl"
# 注意: 将mode设置为"a"表示追加, 但是它要求文件必须存在, 否则报错
"""
writer = pd.ExcelWriter("test.xlsx", mode="a", engine="openpyxl")
"""
# 因此我们需要生成这个文件,此时顺便将第一个 DataFrame 导进去
df1.to_excel("test.xlsx", index=False, sheet_name="a")
# 然后再实例化ExcelWriter
writer = pd.ExcelWriter("test.xlsx", mode="a", engine="openpyxl")
# 接下来还是调用to_excel, 但是第一个参数不再是文件名, 而是上面的writer
# 将剩下的两个DataFrame写进去
df2.to_excel(writer, index=False, sheet_name="b")
df3.to_excel(writer, index=False, sheet_name="c")
# 保存并关闭writer, 写入磁盘
writer.save()
writer.close()
执行代码,然后打开文件看一下。
此时我们看到结果是没有问题的,当然向已存在的 Excel 文件追加 sheet 也是同理。
覆盖一个 sheet
向 Excel 文件同时写入多个sheet,以及追加sheet,我们已经知道该怎么做了,然后是覆盖 sheet。首先我们覆盖 sheet 的时候还要保证其它 sheet 不受影响,所以 mode 仍然要设置为追加模式。
下面问题来了,我们上面的 Excel 文件有 "a"、"b"、"c" 三个 sheet,假设我们想将 "b" 这个 sheet 覆盖掉,应该怎么做呢?可能有人认为,在追加的时候还指定 sheet_name="b" 不就行了,然鹅答案是不行的。
我们看到如果已有同名 sheet,那么不会覆盖,还是创建一个新的 sheet,并自动在结尾处加一个 1。如果我们在此基础上再写入 "b" 这个 sheet 的话,那么又会多出一个名为 "b2" 的sheet。所以最好的办法是,在导入之前先将 sheet 删除。
import pandas as pd
writer = pd.ExcelWriter("test.xlsx", mode="a",
engine="openpyxl")
wb = writer.book
# pandas操作Excel底层也是依赖于其它的模块, 比如xlrd、openpyxl
# 所以这里的 wb = writer.book 就相当于
"""
from openpyxl import load_workbook
wb = load_workbook("test.xlsx")
"""
# 查看已存在的所有的sheet, 总共是5个
# 其中 "b1"和"b2" 是自动创建的
print(wb.sheetnames) # ['a', 'b', 'c', 'b1', 'b2']
# 下面我们来删除sheet
wb.remove(wb["b1"])
wb.remove(wb["b2"])
wb.remove(wb["b"])
df = pd.DataFrame({"name": ["古明地觉", "古明地恋"]})
# 我们将 b 这个 sheet 给删除了
# 所以再导入 "b" 的时候就不会出现 "b3" 了
# 当然 "b1" 和 "b2" 也顺便被我们给删掉了
df.to_excel(writer, index=True, sheet_name="b")
writer.save()
writer.close()
我们看到 "b1"、"b2" 两个 sheet 就没了,当然我们删除的还有 "b" 这个sheet,只不过又重新创建了,当然数据也是我们创建的新数据。
另外可能有人发现多个 sheet 的顺序不再是原来的 "a"、"b"、"c",这是因为在删除 "b" 之后,"a" 和 "c" 就靠在一起了,所以新写入 "b" 的时候就排在 "c" 的后面了,当然个人觉得这没有什么太大影响。
来源:https://mp.weixin.qq.com/s/Omo2e0PMAo_rtF7GSWGCFw


猜你喜欢
- 前言pygame中的精灵碰撞是可见游戏中用的最基础的东西,这里结合官方文档和小甲鱼的网站上的内容做个小总结,方便日后使用。pygame.sp
- SQLServer数据导出到excel有很多种方法,比如dts、ssis、还可以用sql语句调用openrowset。我们这里开拓思路,用C
- 使用程序难免会有出错的时候,如何从大篇代码中找出错误,不仅考验能力,还要考验小伙们的耐心。辛辛苦苦敲出的代码运行不出结果,非常着急是可以理解
- re正则表达式模块还包括一些有用的操作正则表达式的函数。下面主要介绍compile函数。 定义: compile(pattern[,flag
- 1、执行cmd指令,在cmd输出的内容会直接在控制台输出,返回结果为0表示执行成功。2、在调用完shell脚本后,返回一个16位的二进制数,
- 简单生成器有许多优点。生成器除了能够用更自然的方法表达一类问题的流程之外,还极大地改善了许多效率不足之处。在 Python 中,
- 本文实例为大家分享了python实现名片管理系统源代码,供大家参考,具体内容如下import osdef print_menu(): pri
- 协同开发时本地测试昨天的文章中提到了Go如何优雅的进行本地测试,今天分享一下:在多人协同开发中,如果大家都进行本地测试可能会出现的问题。最大
- 通常来说,一个Python程序可以从键盘读取输入,也可以从文件读取输入;而程序的结果可以输出到屏幕上,也可以保存到文件中便于以后使用。本文就
- 一个可能你似曾相识的场景阅读内容包含大量英文的 PPT、Word、Excel 或者记事本时,由于英语不熟悉,为了流利地阅读,需要打开浏览器进
- 在python中读取一个文本文件相信大家都比较熟悉了,但如果我们遇到一个二进制文件要读取怎么办呢?我们尝试使用 Python 中的内置 op
- 前言只有你想不到,没有我找不到写不了的好游戏!哈喽。我是你们的栗子同学啦~今天小编去了我朋友家里玩儿,看到了一个敲可爱的小狗狗,是我朋友养的
- 回调函数用起来比较爽。特别是在js中,满世界全是回调,那么在python中,怎么来优雅地实现自己的回调函数呢下面贴一个我写的例子class
- 在做数据库修改或删除操作中,可能会导致数据错误,甚至数据库奔溃,而有效的定时备份能很好地保护数据库。本篇文章主要讲述Navicat for
- 1:在终端下:mysql -V。 以下是代码片段:[shengting@login ~]$ mysql -Vmysql Ver 14.7 D
- javascript过滤数组重复元素的实现方法 以下是在
- 1:除非你现在已经过了不惑之年了,否则你就一定要保持年轻人特有的激情!这里的激情,包含了那种说不明白的近似于冲动的东西,或者idea。也包含
- 数据去重可以使用duplicated()和drop_duplicates()两个方法。DataFrame.duplicated(subset
- MySQL数据库恢复到指定时间点时,我们必须通过MySQL全备+MySQL增量备份(可选)+MySQL的二进制日志(binlog)进行重放来
- 网上资料结合自己的操作整理出的一套靠谱的彻底卸载Oracle 11g的步骤!(Win7),具体内容详情如下所示:1:停掉所有Oracle相关