【问题标题】:Save list of DataFrames to multisheet Excel spreadsheet将 DataFrame 列表保存到多表 Excel 电子表格
【发布时间】:2012-12-22 22:29:15
【问题描述】:

如何将 DataFrame 列表导出到一个 Excel 电子表格中?
to_excel 状态的文档:

注意事项
如果传递现有的 ExcelWriter 对象,则将添加工作表 到现有的工作簿。这可以用来保存不同的 数据帧到一个工作簿

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,我应该怎么做才能做到这一点?

【问题讨论】:

    标签: python pandas openpyxl


    【解决方案1】:

    你应该使用 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)
            writer.save()
    

    【讨论】:

    • 你觉得这个速度怎么样?我昨天尝试做同样的事情,发现在具有固态驱动器的体面工作站上,将具有 2000 列的数据帧写入 .xlsx 文件每 100 行大约需要 16 秒。在 ipython 中使用 %prun 进行的一些快速分析表明这是由于 XML 处理造成的。最后我通过 CSV 获得了 Excel 中的数据,因为 ExcelWriter 的速度非常慢。
    • 2018 年仍然很慢。
    • 您也可以使用ExcelWriter 作为上下文管理器。 with ExcelWriter(xls_path) as writer: df.to_excel(writer, sheet_name)
    • 谢谢安迪。您介意解释一下'sheet%s' % n 位吗?它有什么作用以及它是如何工作的?
    • @BowenLiu 这只是将工作表命名为 sheet1、sheet2 等。
    【解决方案2】:

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

    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:
            dict_df[key].to_excel(writer, key)
    
        writer.save()
    

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

    【讨论】:

    • 这真的拯救了我的一天。但是有一件事我不明白,尽管它起作用了。 '%s' % key 部分是做什么的?你介意解释一下吗?谢谢!
    • @BowenLiu 获取字典键值,并将其用作 excel 表中的页面名称。 '%s' 是一个用“key”填充的占位符。希望对您有所帮助。
    • 它对我来说非常有用,只需添加一点:在末尾添加 writer.close()。我有 python 3.7 和 windows 10 设置,Microsoft Excel 不会保存对文件所做的更改,因为 python 会访问它。
    【解决方案3】:

    如果数据框中有一些不支持的字符类型,有时可能会出现问题(编写包含 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()
    

    我得到的错误是“IllegalCharacterError”

    有效的代码:

    %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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-11
      相关资源
      最近更新 更多