解决Pandas生成Excel时的sheet问题的方法总结

 更新时间:2022年08月09日 09:50:36   作者:古明地觉  
估计有不少小伙伴在将 DataFrame导入到Excel的时候,遇到过下面这种尴尬的情况:想给一个现有的Excel文件追加一个sheet,结果发现其它的sheet都没了等,本文就来告诉你如何解决这些问题

楔子

估计有不少小伙伴在将 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" 的后面了,当然个人觉得这没有什么太大影响。

以上就是解决Pandas生成Excel时的sheet问题的方法总结的详细内容,更多关于Pandas生成Excel sheet问题的资料请关注脚本之家其它相关文章!

相关文章

  • Jupyter Notebook界面汉化完整步骤

    Jupyter Notebook界面汉化完整步骤

    这篇文章主要给大家介绍了关于Jupyter Notebook界面汉化的相关资料,设置成中文界面后非常利于操作,文中介绍的方法非常简单,需要的朋友可以参考下
    2023-09-09
  • Python替换月份为英文缩写的实现方法

    Python替换月份为英文缩写的实现方法

    今天小编就为大家分享一篇Python替换月份为英文缩写的实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python如何实现游戏中的推送通知与消息

    Python如何实现游戏中的推送通知与消息

    文章介绍了如何使用Python构建高效的游戏消息推送系统,包括使用异步IO和事件驱动编程,以及与Redis、WebSocket等技术的结合,文章还强调了安全性和用户体验的重要性,并提供了性能优化的建议
    2025-01-01
  • python opencv实现图片旋转矩形分割

    python opencv实现图片旋转矩形分割

    这篇文章主要为大家详细介绍了python opencv实现图片旋转矩形分割,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • 微信跳一跳python代码实现

    微信跳一跳python代码实现

    这篇文章主要为大家详细介绍了微信跳一跳python代码实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 在Python中实现函数重载的示例代码

    在Python中实现函数重载的示例代码

    这篇文章主要介绍了在Python中实现函数重载的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Python中正则表达式妙用之以搜索电子邮件地址为例

    Python中正则表达式妙用之以搜索电子邮件地址为例

    这篇文章主要给大家介绍了关于Python中正则表达式妙用之以搜索电子邮件地址为例的相关资料,正则表达式经常被用到,而自己总是记不全,汇总一份完整的以备不时之需,需要的朋友可以参考下
    2024-05-05
  • Python爬虫进阶Scrapy框架精文讲解

    Python爬虫进阶Scrapy框架精文讲解

    这篇文章主要为大家介绍了Python爬虫进阶中Scrapy框架精细讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • python+selenium实现自动化百度搜索关键词

    python+selenium实现自动化百度搜索关键词

    在本篇文章里我们给大家分享了一篇关于python+selenium实现自动化百度搜索关键词的实例文章,需要的朋友们可以跟着操作下。
    2019-06-06
  • python同步windows和linux文件

    python同步windows和linux文件

    这篇文章主要为大家详细介绍了python同步windows和linux文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08

最新评论