【问题标题】:Joining two excel sheets with Python using pandas使用 pandas 将两个 Excel 表与 Python 连接起来
【发布时间】: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。
  • 鉴于默认情况下合并是内部连接,您的最终结果与 df​​1 的长度似乎很奇怪。您是否有一个低规格的系统,碰巧您有如此大的列(以及可能很大的列)和重叠列导致更多列)您的系统正在破坏您的交换文件?
  • 是的,这是可能的。我应该很快就会得到一台新电脑,所以这个想法很快就会得到验证。所以长度没有改变,因为我没有添加新行,而是将新数据(列)添加到 df1 中当前行的末尾。我将尝试在问题中添加一个示例。
  • to_excel 可能是一个相当缓慢的操作,尤其是在处理大量数据的情况下。您可以尝试写入 csv 文件吗?

标签: python excel pandas


【解决方案1】:

听起来好像数据的导入是瓶颈。 我会尝试以下线程来加快导入速度:

使用相似的 Len 尺寸快速测试 Pandas 合并速度:

import time
import pandas as pd
import numpy as np
df1_test = pd.DataFrame.from_items(zip(["Col1","Col2","Col3"], [np.arange(273882),np.arange(273882),np.arange(273882)]))
df2_test = pd.DataFrame.from_items(zip(["Col1","Col2","Col3"], [np.arange(13098),np.arange(13098),np.arange(13098)]))

数据帧的时间合并

startTime = time.time(); df3_test = pd.merge(df1_test, df2_test, left_on='Col1', right_on='Col1'); print ('The script took {0} second !'.format(time.time() - startTime))

脚本耗时 0.0390000343323 秒!

您可以在您的导入部分、合并部分和编写代码部分中尝试此操作,并相应地优化此部分。

【讨论】:

    【解决方案2】:

    以下代码将花费更少的时间来追加和导出。

    1.将df1与df2追加,然后导出为csv。

    Main_df = df1.append(df2)

    注意:- 删除您要附加的特定 df 的标题。

    【讨论】:

    • 我会将此标记为迄今为止的最佳答案,并编辑我的问题,即导出到 csv 的速度要快得多。尝试写入 .xlsx 时,问题似乎是 RAM 不足。
    • 这不是答案,因为追加不等于合并,追加将扩展原始数据框中的行数...我会指定导出为 csv 有助于减少处理时间
    • 好点。取消选择答案,希望我原始帖子中的编辑能够让人们知道这是我的问题的解决方案。
    • 是的,EDIT2 特别有用!您也可以回答自己的问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    相关资源
    最近更新 更多