以高效的内存使用率将 pandas 数据写入 Excel

Writing pandas data to Excel with efficient memory usage

我正在使用 df.to_excel() 成功地将数据帧写入 Excel。不幸的是,这很慢并且会消耗大量内存。数据集越大,它消耗的内存就越多,直到(对于我需要处理的最大数据集)服务器资源匮乏。

我发现使用 df.to_csv() 方法可以提供方便的 chunksize=nnnn 参数。这要快得多并且几乎不消耗额外的内存。精彩的!我将首先写入 .csv,然后在另一个进程中将 .csv 转换为 .xlsx。我试着用 openpyxl 来做,但我发现的每个解决方案都一次一行地遍历 csv 数据,附加到工作簿 sheet,例如

with open(temporary_filepath, 'r') as f:
    for row in csv.reader(f):
        ws.append(row)
wb.save()

这行得通,但是当我观察我的资源监视器时,消耗的内存一样多,速度也一样慢(我现在假设原来的 df.to_excel() 在内部做同样的事情)。所以这种方法终究没有让我摆脱困境。

我原以为我可以做一些相当于 File |另存为,但在 Python 中,例如将整个 csv 读入一个 openpyxl 工作簿并将其一次性保存到一个文件中,无需迭代,但要么这是不可能的,要么我找不到它的文档。

鉴于非常大的 Pandas 数据帧和输出 .xlsx(而非 .csv)的要求,低内存消耗的最佳方法是什么?可以使用 Pandas 或 Openpyxl 高效 完成,还是有更好的工具来完成这项工作?

更新: 看起来 pyexcel 有一个 Save As 方法可以解决问题。如果可能的话,宁愿不向堆栈添加另一个 spreadsheet 库,但如果 pandas 或 openpyxl 中没有等效项,则会这样做。有人用过吗?

也许您可以使用库 pyexcelerate - https://github.com/kz26/PyExcelerate。他们已将基准发布到他们的 github 存储库


from pyexcelerate import Workbook

values = [df.columns] + list(df.values)
wb = Workbook()
wb.new_sheet('data_sheet_name', data=values)
wb.save('data.xlsx')

pyexcelerate 回复正是我所询问的,所以我接受了那个答案,但只是想 post 更新我们找到了一个可能更容易的替代解决方案。在这里分享以防有用。

Pandas 现在比 openpyxl 更喜欢 xlsxwriter。如果已安装,并且您未指定引擎,则默认使用 xlsxwriter(当然您也可以明确指定)。在我的实验中,在写入 Excel 的任务中,xlsxwriter 的内存效率是 openpyxl 的 4 倍。这不是一个无限可扩展的解决方案——仍然可以想象,人们可能会收到一个如此大的数据集,以至于即使进行了这种优化,它仍然会淹没内存——但它非常简单:只需 pip install xlsxwriter,调用时内存使用量就会增加 4 倍df.to_excel(),没有代码更改(在我的例子中)。