Pandas DataFrame 写入 Excel 的三种场景及方法

本文详细介绍了如何使用pandas将DataFrame数据写入Excel文件,包括单个工作表写入、多个工作表写入以及追加模式。通过实例展示了如何在不同的场景下正确配置to_excel()和ExcelWriter,以及利用openpyxl模块进行追加操作。
摘要由CSDN通过智能技术生成

一、引言

本文主要介绍如何将 pandas 的 DataFrame 数据写入 Excel 文件中,涉及三个不同的应用场景:

  • 单个工作表写入:将单个 DataFrame 写入 Excel 表中;
  • 多个工作表写入:将多个 DataFrame 写入到同一个 Excel 表中的不同工作表中;
  • 追加模式写入:针对已有 Excel 文件,在不覆盖原有数据的前提下,将新的 DataFrame 数据追加至指定的工作表中。

二、准备工作

安装必要的库:pandas 和 openpyxl

pip install pandas
pip install openpyxl

准备测试数据

import pandas as pd

data1 = {
    '姓名': ['张三', '李四', '王五'],
    '年龄': [25, 30, 35],
    '城市': ['北京', '上海', '深圳']
}

data2 = {
    '课程': ['语文', '数学', '英语'],
    '分数': [90, 80, 70]
}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

print(df1)
print(df2)

三、将 DataFrame 数据写入 Excel 表

3.1 场景一:将单个 DataFrame 写入 Excel 单个工作表

这是最常用的方法,直接调用to_excel()方法写入即可。
假设我写入到 D 盘下的 write_to_excel.xlsx 文件中,即“D:\write_to_excel.xlsx”,参考代码如下:

filepath = r'D:\write_to_excel.xlsx'
df1.to_excel(filepath, index=False)

注:

  • 在Python中,字符串前面的r表示原始字符串(raw string)。在原始字符串中,反斜杠\不会被当作转义字符。'D:\\write_to_excel.xlsx'r'D:\write_to_excel.xlsx' 是等价的。
  • index = False是不写入 DataFrame 的索引列,默认是写入的,此处设置为不写入。

3.2 场景二:将多个 DataFrame 写入 Excel 多个工作表

在 3.1 中,直接使用to_excel()方法写入时一次性的操作,如果多次调用,后面写入的数据会覆盖前面的数据。比如以下代码,执行完,write_to_excel.xlsx 文件中只有 df2 的数据。

filepath = r'D:\write_to_excel.xlsx'
df1.to_excel(filepath, index=False)
df2.to_excel(filepath, index=False)

image.png

如果要将两个 DataFrame 写入同一个 Excel 表,则需要构建一个对象。
我们可以使用pd.ExcelWriter()来构建对象,示例代码如下:

filepath = r'D:\write_to_excel.xlsx'
with pd.ExcelWriter(filepath) as writer:  
    df1.to_excel(writer, index=False)
    df2.to_excel(writer, index=False)

此时,如果打开 Excel 文件,我们会发现,还是原来的结果,说好的多个写入呢???
这是一个小坑,当写入多个工作表的时候,需要加上sheet_name参数指定工作表的名称。默认是 Sheet1,所以两次都是写入到 Sheet1 工作表中,导致数据不符合预期。
通过 sheet_name指定工作表名称,参考代码如下:

filepath = r'D:\write_to_excel.xlsx'
with pd.ExcelWriter(filepath) as writer:  
    df1.to_excel(writer, index=False, sheet_name='测试-用户信息')
    df2.to_excel(writer, index=False, sheet_name='测试-课程信息')

可以看到,此时的数据便符合我们的预期了,将 df1 写入工作表“测试-用户信息”,将 df2 写入工作表“测试-课程信息”。
image.png

3.3 场景三:追加数据到原有Excel文件的工作表中

前面介绍的场景都是覆盖式的写入,但是如果我是处理了 Excel 表的数据之后,还想把处理好的数据通过新增一个工作表直接追加到原来的 Excel 表中,又该怎么操作呢?
本文提供的方法是借助openpyxl模块来实现,本测试直接在上面 3.2 的文件基础上再写入一次 df1。
具体的操作如下:

  • 使用 openpyxl 模块的load_workbook()方法读取 Excel 表单
  • 对返回的 workbook 对象,使用create_sheet()方法新建一个工作表
  • 再把 df1 的数据写入。df1 的数据无法直接写入 workbook 对象,所以写入前,需要使用dataframe_to_rows()用于将 DataFrame 按行转为列表,然后遍历写入 Excel 新建的工作表中。
  • 最后,一定要记得使用save()保存。否则白干。
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

# 加载现有的Excel文件
filepath = r'D:\write_to_excel.xlsx'
workbook = load_workbook(filepath)
# 创建新的sheet表
new_sheet = workbook.create_sheet('测试追加用户信息表')

for r in dataframe_to_rows(df1, index=False, header=True):
    new_sheet.append(r)

# 保存更改到原Excel文件
workbook.save(filepath)

执行结果如下:
image.png

四、总结

本文介绍了 DataFrame 写入 Excel 的三种场景及方法,代码小结如下:

  • 数据准备
import pandas as pd

data1 = {
    '姓名': ['张三', '李四', '王五'],
    '年龄': [25, 30, 35],
    '城市': ['北京', '上海', '深圳']
}

data2 = {
    '课程': ['语文', '数学', '英语'],
    '分数': [90, 80, 70]
}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
  • 场景一:将单个 DataFrame 写入 Excel 单个工作表
filepath = r'D:\write_to_excel.xlsx'
df1.to_excel(filepath, index=False)
  • 场景二:将多个 DataFrame 写入 Excel 多个工作表
filepath = r'D:\write_to_excel.xlsx'
with pd.ExcelWriter(filepath) as writer:  
    df1.to_excel(writer, index=False, sheet_name='测试-用户信息')
    df2.to_excel(writer, index=False, sheet_name='测试-课程信息')
  • 场景三:追加数据到原有Excel文件的工作表中
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

# 加载现有的Excel文件
filepath = r'D:\write_to_excel.xlsx'
workbook = load_workbook(filepath)
# 创建新的sheet表
new_sheet = workbook.create_sheet('测试追加用户信息表')

for r in dataframe_to_rows(df1, index=False, header=True):
    new_sheet.append(r)

# 保存更改到原Excel文件
workbook.save(filepath)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xin学数据

为你点亮一盏灯,愿你前进无阻。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值