将数据框列表保存到多工作表Excel电子表格

130
如何将多个DataFrame导出到同一个Excel电子表格中? to_excel的文档如下:

注意
如果传递现有的ExcelWriter对象,则该表将被添加到现有的工作簿中。这可用于将不同的DataFrame保存到一个工作簿中。

writer = ExcelWriter('output.xlsx')
df1.to_excel(writer, 'sheet1')
df2.to_excel(writer, 'sheet2')
writer.save()

接着,我认为我可以编写一个函数,将一系列DataFrame保存到同一个电子表格中,代码如下:
from openpyxl.writer.excel import ExcelWriter
def save_xls(list_dfs, xls_path):
    writer = ExcelWriter(xls_path)
    for n, df in enumerate(list_dfs):
        df.to_excel(writer,'sheet%s' % n)
    writer.save()

然而(有两个小的DataFrame列表,每个都可以单独使用to_excel保存),会引发一个异常(编辑:跟踪已删除)

AttributeError: 'str' object has no attribute 'worksheets'

我大概没有正确地调用 ExcelWriter,我应该如何才能做到这一点?

3个回答

182

你应该使用Pandas自带的ExcelWriter类:

from pandas import ExcelWriter
# from pandas.io.parsers import ExcelWriter

然后save_xls函数按预期工作:

def save_xls(list_dfs, xls_path):
    with ExcelWriter(xls_path) as writer:
        for n, df in enumerate(list_dfs):
            df.to_excel(writer,'sheet%s' % n)

12
你对这个速度如何评价?我昨天尝试了同样的操作,将一个有2000列的数据框写入.xlsx文件,使用一台配置不错的工作站和固态硬盘时,每100行的写入需要大约16秒。在ipython中使用%prun进行快速分析后发现这是由于XML处理导致的。最终,我通过CSV转换方式将数据传输到Excel中,因为ExcelWriter的速度太慢了。 - snth
6
2018年仍然很慢。 - stmax
3
你也可以将 ExcelWriter 作为上下文管理器使用。 with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name) - BallpointBen
2
谢谢Andy。你介意解释一下'sheet%s' % n这一部分吗?它是做什么的,它是如何工作的? - Bowen Liu
2
这似乎会覆盖现有的文件。如何编写并保留现有文件?谢谢。 - Confounded
显示剩余5条评论

39

如果有人需要使用数据帧字典的示例:

from pandas import ExcelWriter

def save_xls(dict_df, path):
    """
    Save a dictionary of dataframes to an excel file, 
    with each dataframe as a separate page
    """

    writer = ExcelWriter(path)
    for key in dict_df.keys():
        dict_df[key].to_excel(writer, sheet_name=key)

    writer.save()
< p >示例:< code >save_xls(dict_df=my_dict,path='~/my_path.xls')


这真的救了我的一天。但是有一件事情我不明白,虽然它起作用了。'%s' % key 这部分是什么意思?您能解释一下吗?谢谢! - Bowen Liu
@BowenLiu 使用字典的键值作为Excel表格中页面名称。'%s'是一个占位符,将被"key"替换。希望这能帮到你。 - Jared Marks
2
它对我非常有效,只需要添加一个小细节:在结尾处添加writer.close()。我已经安装了Python 3.7和Windows 10,Microsoft Excel无法保存对文件所做的更改,因为Python正在访问它。 - hru_d

0
有时候在编写包含Unicode的Excel文件时会出现问题,如果数据框中存在不支持的字符类型。为了克服这个问题,我们可以使用“xlsxwriter”包,如下所示:
对于以下代码:
from pandas import ExcelWriter
import xlsxwriter
writer = ExcelWriter('notes.xlsx')
for key in dict_df:
        data[key].to_excel(writer, key,index=False)
writer.save()

我遇到了一个错误,错误信息是"非法字符错误"

下面是有效的代码:

%pip install xlsxwriter
from pandas import ExcelWriter
import xlsxwriter
writer = ExcelWriter('notes.xlsx')
for key in dict_df:
        data[key].to_excel(writer, key,index=False,engine='xlsxwriter')
writer.save()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接