将 pandas 数据写入 Excel 并有效利用内存

sha*_*ker 2 python csv excel pandas openpyxl

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

我发现使用该df.to_csv()方法反而提供了方便的chunksize=nnnn论据。这要快得多并且几乎不消耗额外的内存。精彩的!我将首先写入 .csv,然后在另一个进程中将 .csv 转换为 .xlsx。我尝试使用 openpyxl 执行此操作,但我发现的每个解决方案一次一行地迭代 csv 数据,附加到工作簿表中,例如

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

这是可行的,但是当我观察我的资源监视器时,消耗同样多的内存并且速度同样慢(我现在假设原始版本df.to_excel()在内部执行相同的操作)。所以这种方法最终并没有让我摆脱困境。

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

给定一个非常大的 Pandas 数据帧并要求输出 .xlsx(而不是 .csv),低内存消耗的最佳方法是什么?使用 Pandas 或 Openpyxl可以有效地完成这项工作吗?或者是否有更好的工具来完成这项工作?

更新:看起来 pyexcel 有一个另存为方法可以解决这个问题。如果可能的话,我宁愿不要向堆栈中添加另一个电子表格库,但如果 pandas 或 openpyxl 中没有等效的库,则会这样做。有人用过成功吗?

big*_*nty 5

也许您可以使用该库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')
Run Code Online (Sandbox Code Playgroud)