【发布时间】:2019-01-16 23:43:07
【问题描述】:
我正在尝试将数据放入两个不同的 Excel 工作簿中,每个工作簿只有一张工作表,然后将它们连接或合并在一起。第一个是包含大约 282,000 行数据的工作表,我正在通过一个公共列将包含大约 13,000 行数据的第二个工作表合并到其中。这是一对多的加入。我目前的代码可以运行,但是运行大约需要 2.5 小时,我觉得应该有一种方法可以让它更高效。以下是我的代码:
import pandas
df1 = pandas.read_excel('file1.xlsx')
df2 = pandas.read_excel('file2.xlsx')
final_file = pandas.merge(df1, df2, left_on='OWNER', right_on='ENTITY')
final_file.to_excel('file3.xlsx', index=False)
那么我怎样才能让它运行得更快呢?我应该使用熊猫以外的东西吗?
编辑:所以我认为需要这么长时间的是 final_file.to_excel 。是否有不同/更好的方法来编写合并数据?也许将其写入 df1 中的新工作表?
df1
Owner Prop Decimal
AND15 1031 0.00264
AND15 1032 0.03461
AND16 1037 0.00046
df2
Entity Address Fax
AND15 Fake 123 555-555-5555
AND16 Fake 456 555-555-5544
final_file
Owner Prop Decimal Entity Address Fax
AND15 1031 0.00264 AND15 Fake 123 555-555-5555
AND15 1032 0.03461 AND15 Fake 123 555-555-5555
AND16 1037 0.00046 AND16 Fake 456 555-555-5544
数据等。所以它匹配所有者和实体,然后将 df2 中的列添加到 df1 中匹配行的末尾。
编辑 2:似乎试图将结果写入 .xlsx 是问题所在,我想我的电脑上的 RAM 用完了。执行 final_file.to_csv 不到一分钟。我猜是吸取了教训。
谢谢,
伊森
【问题讨论】:
-
len(df1), len(df2), len(final_file)的结果是什么?两个 DF 上连接列的唯一计数是多少。你确定你不是在做多对多连接等吗? -
所以第二个 excel 表(约 13k 长度)在连接列上都是唯一的。我基本上是从 df2 中获取数据,并找到“实体”列与 df1 中的“所有者”列匹配的位置,然后将其余数据复制过来。 len(df1) 是 273882,len(df2) 是 13098,len(final_file) 是 273882。
-
鉴于默认情况下合并是内部连接,您的最终结果与 df1 的长度似乎很奇怪。您是否有一个低规格的系统,碰巧您有如此大的列(以及可能很大的列)和重叠列导致更多列)您的系统正在破坏您的交换文件?
-
是的,这是可能的。我应该很快就会得到一台新电脑,所以这个想法很快就会得到验证。所以长度没有改变,因为我没有添加新行,而是将新数据(列)添加到 df1 中当前行的末尾。我将尝试在问题中添加一个示例。
-
to_excel可能是一个相当缓慢的操作,尤其是在处理大量数据的情况下。您可以尝试写入 csv 文件吗?