Python:在多张工作表上将 Pandas DataFrame 写入 Excel 的最快方法

Posted

技术标签:

【中文标题】Python:在多张工作表上将 Pandas DataFrame 写入 Excel 的最快方法【英文标题】:Python: fastest way to write pandas DataFrame to Excel on multiple sheets 【发布时间】:2014-11-09 21:14:11 【问题描述】:

我需要将 24 个 pandas 数据帧(140 列 x 400 行) 导出到 Excel,每个都导出到不同的工作表中。

我正在使用 pandas' 内置 ExcelWriter。运行 24 个场景,需要:

写入.xls 文件需要 51 秒(使用 xlwt

86 秒写入 .xlsx 文件(使用 XlsxWriter

141 秒写入 .xlsm 文件(使用 openpyxl

21 秒即可运行程序(无 Excel 输出)

写信给.xls 的问题是电子表格不包含格式化样式,所以如果我在 Excel 中打开它,选择一列,然后单击“逗号”按钮来格式化数字,它会告诉我:'找不到样式逗号'。我写信给.xlsx 没有遇到这个问题,但这更慢。

关于如何加快导出速度有什么建议吗? 我不可能是第一个遇到这个问题的人,但是在搜索论坛和网站数小时后,我还没有找到任何明确的解决方案。

我唯一能想到的就是用Python导出成csv文件,然后写一个Excel宏把所有的CSV合并成一个电子表格。

.xls 文件为 10 MB,.xlsx 为 5.2 MB

谢谢!

【问题讨论】:

我认为大小的差异源于excel和不同的文件格式,而不是写作方法。此外 - 您不需要 excel 宏来将 csvs 合并到电子表格中,使用 xlwt 编写脚本非常简单。 是的,当然,大小的差异取决于嵌入在 xlsx 格式中的压缩。那不是问题。问题是仅仅写入 5 MB 数据就需要 60 秒似乎过多。鉴于 Python 包对 Excel 的写入 pandas 数据帧是如此缓慢,他们会更快地将 csv 写入 Excel 吗?我还没有时间测试它,但我对此表示怀疑。我希望使用 Excel 和 VBA 合并 CSV 会更快。像导出几 MB 数据这样平庸的事情需要这么长时间,这有点令人沮丧…… 所以,我已经运行了一些测试:加载 24 个 CSV 并将它们放到 Excel 文件的单独工作表中需要:Excel VBA 宏:5 秒。带有 xlsxWriter 的 Python 脚本:24 秒(34 秒,'constant_memory': True,很奇怪)。也许最好的选择是从 Python 运行 VBA 宏,如以下示例所示:***.com/questions/2141967/…***.com/questions/441758/… 我现在没有代码,但我已经用 xlwt 编写了样式/格式。如果你有兴趣,我可以查一下。此外,请尝试在此处获取有关 xlwt 的更多信息:groups.google.com/forum/#!forum/python-excel 这是benchmark for different Python to Excel modules。确保在目标机器上运行它,因为它会受到 Python/模块版本、CPU、RAM 和磁盘 I/O 的影响。 【参考方案1】:

不管怎样,这就是我在 xlwt 中格式化输出的方式。文档(或至少是)参差不齐,所以我不得不猜测其中的大部分内容!

import xlwt

style = xlwt.XFStyle()
style.font.name = 'Courier'
style.font.height = 180
style.num_format_str = '#,##0'

# ws0 is a worksheet
ws0.write( row, col, value, style )

另外,我相信我在尝试将生成的电子表格格式化为 excel(Office 2010 版本)时重复了您的错误消息。这很奇怪,但有些下拉工具栏格式选项有效,有些则无效。但是,如果我通过右键单击“格式化单元格”,它们看起来都可以正常工作。

【讨论】:

【参考方案2】:

这是benchmark for different Python to Excel modules。

这是发布时使用最新版本模块的 140 列 x (400 x 24) 行的输出:

Versions:
    python      : 2.7.7
    openpyxl    : 2.0.5
    pyexcelerate: 0.6.3
    xlsxwriter  : 0.5.7
    xlwt        : 0.7.5

Dimensions:
    Rows = 9600 (400 x 24)
    Cols = 140

Times:
    pyexcelerate          :  11.85
    xlwt                  :  17.64
    xlsxwriter (optimised):  21.63
    xlsxwriter            :  26.76
    openpyxl   (optimised):  95.18
    openpyxl              : 119.29

与任何基准测试一样,结果将取决于 Python/模块版本、CPU、RAM 和磁盘 I/O 以及基准测试本身。因此,请务必为您自己的设置验证这些结果。

另外,由于您专门询问了 Pandas,请注意 PyExcelerate isn't supported。

【讨论】:

我认为 pyexcelerate 已经过时并且多年前已被纳入 xlwt。这是一个新版本和/或与旧的 pyexcelerate 无关? 那是 PyExcelerator。 PyExcelerate 是一个不同的无关模块。令人困惑。

以上是关于Python:在多张工作表上将 Pandas DataFrame 写入 Excel 的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

Python 多张表导出为 csv

Pandas:将一个数据框分割成同一个电子表格的多张表

Python:如何从一个excel文件中循环遍历多张工作表并将它们组合成一个数据框

pandas中的concat函数拼接多张表时,为什么拼接后的结果除第一张表其他都是NaN

Python pandas groupby 方法无法正常工作

在 Pandas 中连接 Excel 文件表,以 CSV 格式每 1 行将大型 Pandas 数据框导出到新的 Excel 文件。自动化?