Pandas DataFrame.to_excel() - 保存数据到Excel的非官方指南

1,720 阅读11分钟

Microsoft Excel是一个跨平台和经过战斗考验的电子表格软件,广泛用于数据分析和可视化。它确实是一个强大的、用户友好的工具!但是,我们怎样才能使它更上一层楼呢?

我们可以将Excel与Python结合起来,以便

请继续阅读,如果听起来不错的话,请继续关注我的Excel in Python系列。

本教程是关于将数据保存到Excel。

具体来说,我将首先介绍Excel的数据结构和lingos。

然后,你将学习四种流行的Python保存数据到Excel的方式的区别,包括pandasopenpyxl

最后,我将重点介绍 **pandas.DataFrame.to_excel()**方法。我将引导你在pandas.DataFrame.to_excel() ,从一个Excel工作表、多个Excel工作表、多个Excel工作簿和处理索引情况等四个实际用例。

你可以在这里找到本教程中的所有数据集和代码。我们的示例数据集中的数据不是实际数据,仅用于教育目的。

Excel的快速介绍

在开始保存数据到Excel之前,让我们先看看数据是如何在Excel中存储的,并熟悉一些Excel的术语。

简单地说,数据存储在Excel的单元格中,每个单元格都可以通过其独特的行和列的编号对来识别。

Excel中的列是用字母标注的,从 "A"开始,而行是用罗马数字标注的,从 "1"开始。例如,在下面的Excel图片中,A1 是第一列和第一行的交叉处的单元格,'ID'。

是的,你明白了!这就像我们的朋友pandas中的DataFrame数据结构。

而如果你想选择一个区域将数据转储到Excel中,你可以想象根据该部分的左上角单元格绘制一个矩形数据区域。

在此基础上,其他常见的Excel语义包括工作表和工作簿。

  • 工作表指的是一个Excel文件中的单个电子表格。
  • 一个工作簿 指的是一个单一的Excel文件,其扩展名是:.xlsx.xls

提示:Excel支持的更多文件扩展名可以在微软官方文档中找到 这里.

现在,你已经准备好知道如何将数据保存到Excel中了!

流行的Python保存数据到Excel的方法

下面是流行的Python保存数据到Excel的方法的总结。

save data to excel python pandas

pandas.DataFrame.to_excel()'的优势之一是引擎兼容性。它为不同的Excel扩展使用了多个外部引擎,包括openpyxl,xlwt, 和xlsxwriter

  • "xlwt" 支持旧式的微软Excel 95至2003版本的文件(.xls)。
  • "openpyxl" 支持较新的Excel 2010文件格式(.xlsx, .xlsm, .xltx, .xltm)。
  • "xlsxwriter" 支持Excel 2007+文件格式(.xlsx)。

总之,你可以使用openpyxl 和其他库来处理特定的Excel文件格式和基本的数据处理。并且请记住,openpyxlxlsxwriter 支持较新的 Excel 文件格式

然而,我建议在数据科学和分析应用中使用pandas.DataFrame.to_excel() ,因为它支持大多数Excel文件格式,并接受具有强大方法的DataFrame对象。

因此,让我们看看如何使用pandas.DataFrame.to_excel() 来保存数据到Excel!

保存数据到Excel - pandas.DataFrame.to_excel()

由于pandas.DataFrame.to_excel() 是从不同扩展名的 Excel 文件中保存数据的最强大和最包容的方法,我将首先介绍它的语法,并在下面用真实的 Python 代码引导你完成三个用例,使用pandas.DataFrame.to_excel()

认识pandas.ExcelWriter

在进入pandas.DataFrame.to_excel 方法之前,我们需要认识一个新朋友,pandas.ExcelWriter 。它是一个用于将pandas.DataFrame 对象写入excel表格的类。

当你试图写入多个工作表时,你需要创建一个ExcelWriter 对象并将其作为第一个参数传递给pandas.DataFrame.to_excel()

为了创建一个ExcelWriter 对象,我们根据它的语法向它传递一些东西。

# Syntax for pandas.ExcelWriter
pandas.ExcelWriter(path[, engine=None[, date_format=None[, datetime_format=None[, mode='w'[, storage_options=None[, if_sheet_exists=None[, engine_kwargs=None[, **kwargs]]]]]])

参数描述
path需要字符串或typing.BinaryIO 到一个Excel文件。
engine可选的字符串,指定用于写入的引擎。缺省是使用:
xlwt forxls 
xlsxwriter forxlsx ifxlsxwriter is installed otherwiseopenpyxl
odf for

ods

| | date_format | 可选的 | 写入Excel文件的日期格式字符串(例如:'YYYY-MM-DD' )。 | | datetime_format | 可选的 | 写入Excel文件的datetime 对象的格式字符串。(例如:'YYYY-MM-DD HH:MM:SS')。 | | mode | 可选的 | 要使用的文件模式('w' 用于写入;'a' 用于追加)。默认使用'w' 。 | | storage_options | 可选的 | 一个对特定存储连接有意义的字典,如主机、端口、用户名、密码等。 | | if_sheet_exists | 可选的 | 如果在append模式下存在一个工作表,该怎么做。接受{'error', 'new', 'replace', 'overlay'} 。默认为'error'
error :引发一个ValueError
new :创建一个新的工作表,名称由引擎决定。
replace :在写入工作表之前删除工作表的内容。
overlay

:向现有工作表写入内容,而不删除旧的内容。 | | engine_kwargs | 可选的 | 一个包含传入引擎的关键字参数的字典。 |

💡 提示。一般来说,你只需要使用粗体字格式的四个参数。默认的引擎会根据文件的扩展名自动选择。

一个小提示:为了与CSV写入器兼容,ExcelWriter ,在写入前将列表字典序列化为字符串

最后,如果你使用 [with](https://blog.finxter.com/python-one-line-with-statement/)语句来创建一个ExcelWriter ,你不需要担心在最后保存更改的问题!在with 语句中创建一个ExcelWriter 的示例代码是。

import pandas as pd

df = pd.DataFrame()
excel_wb56_filepath = 'learn_excel_56.xlsx'

# Syntax for create an ExcelWriter object in the with statement
# To create a new empty Excel file, learn_excel_56.xlsx with two new sheets!
with pd.ExcelWriter(excel_wb56_filepath) as writer:
    df.to_excel(writer, sheet_name='Class 5')
    df.to_excel(writer, sheet_name='Class 6')

运行代码后,我们创建了一个新的空的Excel文件,learn_excel_56.xlsx ,有两个新的工作表,第5类和第6类!

满足pandas.DataFrame.to_excel

Hooray!现在,让我们看看pandas.DataFrame.to_excel 方法的语法和参数,为后面的例子做好准备!

下面是pandas.DataFrame.to_excel 的语法。

# Syntax for pandas.DataFrame.to_excel
DataFrame.to_excel(excel_writer[, sheet_name='Sheet1'[, na_rep=''[, float_format=None[, columns=None[, header=True[, index=True[, index_label=None[, startrow=0[, startcol=0[, engine=None[, merge_cells=True[, encoding=None[, inf_rep='inf'[, verbose=True[, freeze_panes=None[, storage_options=None]]]]]]]]]]]]]]]])

要将单个对象(pandas.DataFrame )写入Excel.xlsx 文件,只需指定一个目标文件名。要写到多个工作表,必须创建一个带有目标文件名的ExcelWriter 对象。

参数描述
excel_writer需要目标文件名或ExcelWriter 对象。
sheet_name可选的包含DataFrame的工作表的名称。默认为"Sheet 1"
na_rep可选的缺少的数据表示。Default = ""
float_format可选的浮点数的格式字符串。例如float_format="%.2f" ,将0.1234格式化为0.12。
column可选的要写入的列(在DataFrame中)。
header可选的作为标题的行,从数据部分排除。Default = True如果是这样,则表示第一行。如果None ,则没有页眉。
index可选的写入行名(索引)。默认为True ,表示显示索引。如果设置为False ,意味着在输出的Excel工作表中没有索引。
index_label可选的索引的列标签。
startrow可选的转储数据框架的左上角单元格行。默认为0。
startcol可选的转储数据框架的左上角单元格列。默认为0。
engine可选的指定用于写入的引擎的字符串。xls
如果安装了xlsxwriter
默认为xlwt
如果安装了xlsxwriter ,默认为xlsx ;否则为openpyxl
merge_cells可选的MultiIndex 和Hierarchical Rows写成合并的单元。
encoding可选的产生的EXCEL文件的编码。只有xlwt ,其他写入器都支持Unicode。
inf_rep可选的表示无穷大(在Excel中没有关于无穷大的原始表示)。
verbose可选的在错误日志中显示更多信息。
freeze_panes可选的指定要冻结的基于最底层的行和最右边的列。
storage_options可选的对特定的存储连接有意义的额外选项,例如:主机、端口、用户名、密码等。

提示:一般来说,你只需要使用粗体字格式的四个参数。

请现在尽量对这些参数有一个直觉,我将在下一个精彩的例子中介绍sheet_name,index, 和index_label 参数的细节!

开始使用

要使用pandas.DataFrame.to_excel 方法,你需要首先在你的命令行中安装 pandas 包。

$ pip install pandas 

提示:你可能需要使用pip3 ,而不是pip ,这取决于你的环境。

鉴于上面提到的引擎兼容性,你还需要安装各自的引擎库。例如,要使用openpyxl ,你需要在你的命令行中安装这个包。

$ pip install openpyxl

提示:你可能需要使用pip3 ,而不是pip ,这取决于你的环境。

顺便说一下,如果你已经安装了Anaconda,你可以跳过这一步。🙂

数据集

在我们的例子中,我们将创建Excel工作簿,就像我们第一个Excel in Python系列中的两个Excel工作簿(.xlsx)、learn_excel_12learn_excel_34

这些工作簿在每个工作表中都有相同的数据结构和列名。例如,下面是learn_excel_12 工作簿中的Class_1 工作表的数据。

每张工作表中的一行代表每个班级的一个学生,各列分别代表该学生的ID、专业和分数。

具体来说,learn_excel_12 有两个工作表,1班和2班。而learn_excel_34 有两个工作表,即3班和4班。

你可以在这里找到本教程中的所有数据集和代码。我们的示例数据集中的数据不是实际数据,仅用于教育目的。

保存数据到一个工作表

那么,我们怎样才能将数据保存到一个excel工作表中呢?我们可以传递一个目标文件名,或者创建一个ExcelWriter 对象来实现!

对于我们的例子,我们可以创建一个新的Excel文件,learn_excel_56 ,并将一些学生数据写入5级工作表,通过参数sheet_name

import pandas as pd

# For our writing mode example,
# we can create a new Excel file, learn_excel_56
# and write some student data into it.
excel_fp = 'learn_excel_56.xlsx'
class5_df = pd.DataFrame(
    {'ID': [51, 52], 'Major': ['English', 'Math'], 'Score': [98, 89]})

with pd.ExcelWriter(excel_fp, mode='w') as writer:
    class5_df.to_excel(writer, sheet_name='Class 5', index=False)

运行该代码后,我们可以得到输出的Excel文件。

保存数据到多个工作表

同样地,我们可以通过多次调用pandas.DataFrame.to_excel() 方法将数据保存到多个工作表。

在我们的例子中,我们可以创建一个新的Excel文件,learn_excel_56 ,并将一些学生数据写入5班工作表和6班工作表中,通过参数sheet_name

import pandas as pd

# For our writing mode example,
# we can create a new Excel file, learn_excel_56
# and write some student data into it.
excel_fp = 'learn_excel_56.xlsx'
class5_df = pd.DataFrame(
    {'ID': [51, 52], 'Major': ['English', 'Math'], 'Score': [98, 89]})
class6_df = pd.DataFrame(
    {'ID': [61, 62], 'Major': ['History', 'Math'], 'Score': [78, 96]})

with pd.ExcelWriter(excel_fp, mode='w') as writer:
    class5_df.to_excel(writer, sheet_name='Class 5', index=False)
    class6_df.to_excel(writer, sheet_name='Class 6', index=False)

运行该代码后,我们可以得到输出的Excel文件。

保存数据到多个工作簿

要获得多个工作簿,我们可以直接创建多个pandas.ExcelWriter 对象。

🙂

举个简单的例子,让我们创建两个工作簿,learn_excel_78learn_excel_910

import pandas as pd

# let’s create two workbooks, learn_excel_78 and learn_excel_910.
wb78_fp = 'learn_excel_78.xlsx'
wb910_fp = 'learn_excel_910.xlsx'

df = pd.DataFrame()

with pd.ExcelWriter(wb78_fp, mode='w') as writer_78, pd.ExcelWriter(wb910_fp, mode='w') as writer_910:
    df.to_excel(writer_78, sheet_name='Class 7', index=False)
    df.to_excel(writer_78, sheet_name='Class 8', index=False)
    df.to_excel(writer_910, sheet_name='Class 9', index=False)
    df.to_excel(writer_910, sheet_name='Class 10', index=False)

运行代码后,我们可以得到输出的工作簿。

learn_excel_78 文件中,我们可以看到我们已经创建了两个空工作表。

到目前为止,我们已经了解了基本的书写操作。让我们继续前进,处理最常见的问题--索引🙂

处理索引

你可以在调用pandas.DataFrame.to_excel() 方法时设置索引和索引'列标签。

之前,我们的示例代码将索引设置为False ,这意味着在输出的Excel文件中没有索引列。让我们看看在多工作表的情况下,如果我们将索引设置为True ,会发生什么。

import pandas as pd

# For our writing mode example,
# we can create a new Excel file, learn_excel_56
# and write some student data into it.
excel_fp = 'learn_excel_56.xlsx'
class5_df = pd.DataFrame(
    {'ID': [51, 52], 'Major': ['English', 'Math'], 'Score': [98, 89]})
class6_df = pd.DataFrame(
    {'ID': [61, 62], 'Major': ['History', 'Math'], 'Score': [78, 96]})

with pd.ExcelWriter(excel_fp, mode='w') as writer:
    class5_df.to_excel(writer, sheet_name='Class 5', index=True)
    class6_df.to_excel(writer, sheet_name='Class 6', index=True)

运行代码后,我们可以看到,我们现在有一个索引列,从零开始计算。

在此基础上,我们可以通过指定参数index_label ,给索引列起一个列名。

import pandas as pd

# For our writing mode example,
# we can create a new Excel file, learn_excel_56
# and write some student data into it.
excel_fp = 'learn_excel_56.xlsx'
class5_df = pd.DataFrame(
    {'ID': [51, 52], 'Major': ['English', 'Math'], 'Score': [98, 89]})
class6_df = pd.DataFrame(
    {'ID': [61, 62], 'Major': ['History', 'Math'], 'Score': [78, 96]})

with pd.ExcelWriter(excel_fp, mode='w') as writer:
    class5_df.to_excel(writer, sheet_name='Class 5',
                       index=True, index_label='No.')
    class6_df.to_excel(writer, sheet_name='Class 6',
                       index=True, index_label='No.')

运行代码后,我们可以看到我们现在有了一个索引列,名称是 "No."!

总结

这就是如何保存数据到Excel。这是我们的 Excel in Python 系列中的第二篇文章。

我们了解了 Excel 的数据结构和常用的 lingos,以及用 Python 保存数据到 Excel 的四种常用方法,包括pandasopenpyxl

最后,我们在pandas.DataFrame.to_excel ,看了四个实际的用例,范围包括一个Excel工作表、多个Excel工作表、多个Excel工作簿,以及处理索引情况。

我希望你喜欢这一切,请继续关注我们下面的Excel in Python文章:将数据保存到Excel!编码愉快!