使用Pandas加速excel文件的连接

时间:2017-04-06 15:32:30

标签: python excel performance pandas concatenation

我尝试使用以下代码将多个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?

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

1 个答案:

答案 0 :(得分:0)

我发现你的熊猫代码没有任何问题;一个300mb的excel文件可能只是Pandas要处理的很多东西!以下是我采取的一些方法:

战术1.调查

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

Tactic 2.尝试不同的工具

Pandas针对科学计算进行了优化,它可能花费相当多的时间来组织数据以进行查询等。 ETL不是它的主要目的。如果你只需要连接一些表,(尽管我建议手动做一些事情很痛苦!)Excel本身的手动工作可能是最快的方法 - 微软高薪工程师的任务是优化。如果您需要一种程序化方法,可能值得尝试petl或讨论here之一的工具,它们可能采用比熊猫更简单/更有效的方法。

一些示例petl代码可以解决这个问题:

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