将DataFrames列表保存到多页Excel电子表格


89

如何将DataFrames列表导出到一个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的列表,每个小DataFrame可以to_excel单独保存),引发了一个异常(编辑:删除了traceback)

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

大概我ExcelWriter打错电话了,应该怎么做才能做到这一点?

Answers:


135

您应该使用熊猫自己的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)
        writer.save()

11
您如何找到它的速度?昨天我尝试做同样的事情,发现在具有固态驱动器的体面工作站上,将具有2000列的数据帧写入.xlsx文件大约需要每100行16秒。在ipython中使用%prun进行的快速分析表明这是由于XML处理所致。最后,我通过CSV获得了Excel中的数据,因为ExcelWriter的速度过慢。
snth 2013年

6
在2018
。– stmax

2
您还可以ExcelWriter用作上下文管理器。with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
BallpointBen

2
谢谢安迪。您介意解释'sheet%s' % n一下吗?它是做什么的,它是如何工作的?
Bowen Liu

2
@BowenLiu只是将工作表命名为sheet1,sheet2等。
xiaomy

17

如果有人需要一个如何使用数据帧字典执行此操作的示例:

from pandas import ExcelWriter

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

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

    writer.save()

例: save_xls(dict_df = my_dict, path = '~/my_path.xls')


这确实挽救了我的一天。但是有一点我不理解,尽管它起作用了。该零件'%s' % key做什么?您介意解释吗?谢谢!
刘宝文

@BowenLiu接受字典键值,并将其用于excel工作表中的页面名称。'%s'是一个占位符,其中填充了“关键字”。希望能有所帮助。
贾里德·马克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.