【问题标题】:Speed up concatenation of excel files with Pandas使用 Pandas 加速 excel 文件的连接
【发布时间】:2017-09-01 17:51:57
【问题描述】:

我正在尝试使用以下代码将多个 excel 文件与 pandas 合并:

import pandas as pd
from os.path import basename


df = []
for f in ['test1.xlsx', 'test2.xlsx']:
    data = pd.read_excel(f, 'Sheet1')
    data.index = [basename(f)] * len(data)
    df.append(data)

df = pd.concat(df)

df.to_excel("merged_data2.xlsx")

这在测试文件上运行良好,但在其他 3 个大小超过 100mb 的 excel 文件上尝试时,过程变得太慢而无法使用。我看到了关于这个主题的另一个帖子:Why does concatenation of DataFrames get exponentially slower?

而且我相信我已经正确地遵循了在连接之前使用列表但没有成功的建议。有任何想法吗?谢谢。

【问题讨论】:

    标签: python excel performance pandas concatenation


    【解决方案1】:

    我认为您的 pandas 代码没有任何问题;一个 300mb 的 excel 文件对于 Pandas 来说可能需要处理很多!以下是我会采取的一些方法:

    策略 1. 调查

    如果我是你,我调试的下一步是将一些 print(datetime.now()) 语句放入循环中,看看是读取、连接还是 .to_excel 需要时间。这样你就可以缩小问题的范围。还可以使用适用于您所在操作系统的适当工具查看您的内存使用情况。

    策略 2. 尝试不同的工具

    Pandas 针对科学计算进行了优化,它可能会花费大量时间来组织数据以进行查询等。 ETL 不是它的主要目的。如果您只需要连接几张工作表,(尽管我建议手动做一些事情让我很痛苦!)Excel 本身的手动工作可能是最快的方法 - 微软的高薪工程师一直致力于优化.如果您需要一种编程方法,可能值得尝试petlhere 讨论的工具之一,它可能采用比 pandas 更简单/更有效的方法。

    一些示例 petl 可能会起作用的代码:

    import petl
    petl.cat(*
        petl.io.fromxlsx(file)
        for file in ['your.xlsx', 'excel.xlsx', 'files.xlsx']
    ).progress().toxlsx()
    

    【讨论】:

    • 感谢您的回复!我一直在关注内存使用情况,它在几百 mb 到超过 4gb 之间波动很长时间。总体而言,该过程确实完成了,但在具有 8GB RAM 的 8 核 AMD CPU 上花费了一个多小时。我会尝试你的其他建议并进一步调查。谢谢!
    猜你喜欢
    • 2022-06-10
    • 2018-06-14
    • 2018-02-07
    • 2019-11-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    相关资源
    最近更新 更多