我正在尝试使用以下代码将多个 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指数慢?
我相信我在连接之前正确遵循了使用列表的建议,但没有成功。有什么想法吗?谢谢。
我没有发现你的pandas代码有什么问题; 300mb 的 excel 文件对于 Pandas 来说可能太大了!以下是我会采取的一些方法:
如果我是你,调试的下一步将是将一些
print(datetime.now())
语句放入循环中,看看是否是读取、连接或 .to_excel
花费了时间。这样您就可以缩小问题范围。另外,请使用适合您所在操作系统的适当工具来查看您的内存使用情况。
Pandas 针对科学计算进行了优化,它可能会花费大量时间来组织数据以进行查询等。 ETL 不是它的主要目的。如果您只需要连接几张工作表(尽管我建议手动执行某些操作,这让我很痛苦!),在 Excel 中手动工作可能是最快的方法 - 微软的高薪工程师一直负责优化它。如果您需要一种编程方法,可能值得尝试 petl 或here 讨论的工具之一,它可能采用比 pandas 更简单/更有效的方法。
一些示例
petl
代码可能可以解决这个问题:
import petl
petl.cat(*
petl.io.fromxlsx(file)
for file in ['your.xlsx', 'excel.xlsx', 'files.xlsx']
).progress().toxlsx()
这个问题已经开放很长时间了,但是,对于那些面临这个问题的人,我留下了我实现的一个项目的链接,该项目的重点是获得将 Excel 工作表转换为 Pandas 数据帧的性能。
查看项目这里。