Pandas的df.to_excel速度非常慢,有没有任何方法可以加快它的速度?

3
我正在处理一组包含近60列(文本/地址/数字)的数据。在使用Pandas处理数据后,我需要将其导出为xlsx格式。
以下是我生成输出的方法:
with pd.ExcelWriter("output.xlsx", engine='xlsxwriter') as writer:
    df.to_excel(writer, sheet_name="sheet", index=False)

我也尝试过这种方法:

df.to_excel('output.xlsx', index=False, engine='xlsxwriter')

我注意到的是,生成 xlsx 格式比如 csv 格式要慢得多。并且随着记录数的增长,生成 xlsx 文件所需时间显著增加。

enter image description here

这是.to_excel的正常预期行为吗?还是存在问题?有没有办法进行调试并解决这个问题?
我需要能够在几秒钟内生成大约300K到600K条记录的xlsx文件,但是正如您所看到的,我需要花费大约6分钟来生成大约500K条记录的Excel文件。
我用于生成这些文件的硬件具有16个CPU核心和64GB内存。

我认为你不会得到可比较的速度,但时间差很有趣。 - Umar.H
将数据导出为 CSV 文件,然后在 Excel 中导入 CSV 文件有什么问题吗? - svebert
@svebert 目前我们正在这样做。然而,由于数据包含许多不同类型的字符(仅举几例:分号、冒号、逗号、单引号和双引号等),很难从中得到一个干净且可用的 CVS 输出。更不用说其中一些字符是有意义的,我们不能只是将它们丢弃。 - Ravexina
当你说“我必须能够在几秒钟内生成大约300K到600K条记录的xlsx文件”时,你是如何做到的? - jmcnamara
@Ravexina,你目前使用df.to_csv()吗?还是其他什么方法? - svebert
显示剩余2条评论
2个回答

2

我发现一种比仅使用engine='xlsxwriter'更快的解决方案。

import pandas as pd
from xlsxwriter.workbook import Workbook

def export_excel(df: pd.DataFrame, file_path_out: str):
    workbook = Workbook(file_path_out)
    worksheet = workbook.add_worksheet()

    worksheet.write_row(0, 0, [col for col in df.columns])

    for index, row in df.iterrows():
        worksheet.write_row(index+1, 0, [col for col in row])
    workbook.close()

以下表格显示了处理100到50k行随机数据(60列)的三种方法的运行时间。测量时间以秒为单位。openpyxl和xlsxwriter是df.export_excel(engine=...)调用,而export_excel是我提出的代码。虽然它不是改变游戏规则的东西...但它更快。
row count: openpyxl, xlsxwriter, export_excel
100: 0.1272597312927246, 0.15707993507385254, 0.12616825103759766
1000: 1.1917698383331299, 0.8460557460784912, 0.7760021686553955
10000: 12.29027795791626, 8.1415114402771, 6.129252195358276
25000: 32.34258818626404, 23.32529616355896, 18.124294996261597
50000: 63.35693168640137, 40.77235984802246, 30.406764268875122

使用workbook = Workbook(file_path_out, {'constant_memory': True})将进一步提高运行时间(但并不会有太大的改善:对于25k行,快了1秒)。


如果使用xlsxwriter的worksheet.write_column()而不是df.iterrows()worksheet.write_row(),在export_excel中是否有显著的改进? - jmcnamara
不行。现在我正在度假。 - svebert

1
根据 pandas.DataFrame.to_excel 文档engine 的值可以是 openpyxl 或者 xlsxwriter,由于你使用的是后者,建议测试 engine='openpyxl'engine='xlsxwriter'

我已使用openpyxl更新了问题结果。 - Ravexina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接