【问题标题】:Compare two giant dataframes比较两个巨型数据框
【发布时间】:2020-02-12 10:54:57
【问题描述】:

我有两个巨大的数据框,一个有 38k 行,另一个有 42k。我正在尝试编写一个代码来比较这两个 df 并隔离不会在另一个中退出的唯一行。我尝试了嵌套循环,但数据量太多了,需要很长时间才能完成。我正在寻找一种更简单、更有效的方式来完成这项工作。情况如下: Df1 有以下重要列:Business_unit、operating_unit、Process_num、Res_type。 Df2 具有相似的列,但名称不同。例如,Business_unit 现在是 Unit。 Operating_unit 现在是操作单元。 此外,这些列的数据类型在两个表中是不同的。例如,Business Unit 在一个表中是 01(str),但在另一个表中是 1(int)。因此,如果我要使用 concat 然后删除重复项,我将不得不将两个表设置为相同的格式。我该怎么做呢?我目前正在使用以下嵌套循环,但这只能处理大约 1000 行。除此之外的任何事情都需要永远运行。

match_count=0
for index, row_a in SQL_download.head(n=1000).iterrows():
    for index, row_b in web_pull.head(n=1000).iterrows():
        if int(row_a['Process_Number'])==row_b['Process'] and int(row_a['Resource_Type'])==row_b['Res Type'] and row_a['Amount']==row_b['Sum Amount'] \
        and int(row_a['BUSINESS_UNIT'])==row_b['Unit'] and int(row_a['OPERATING_UNIT'])==row_b['Oper Unit'] and int(row_a['ACCOUNT'])==row_b['Account']:
            findmatch=True
            match_count=match_count+1
            break

【问题讨论】:

  • concat 然后按~df.duplicated(keep=False) 过滤。您应该提供minimal reproducible example,以便有人可以为您的问题提供答案。否则有太多的假设要做。
  • 两张表相同但不完全相同。所以我需要让它们符合相同的格式和数据类型,然后才能消除重复,对吗?
  • 我下面的建议有什么问题吗?如果是,请发表评论,否则请点赞。
  • @Setop,我喜欢你的方法。但是,它有几个问题。 1. 我需要过滤几列,而不仅仅是一列。 2.我的两张表相同但不完全相同。假设一个表中的业务单元 01 只是另一个表中的整数 1。

标签: pandas loops dataframe compare


【解决方案1】:

您可以结合合并和过滤:

import pandas as pd

df1 = pd.DataFrame({'col1': [0, 1], 'col_left': ['a', 'b']})
df2 = pd.DataFrame({'col1': [1, 2, 2], 'col_right': [2, 2, 2]})

df3 = df1.merge(df2, on="col1", how="outer", indicator=True)

df3[df3._merge != "both"]

产生:

   col1 col_left  col_right      _merge
0     0        a        NaN   left_only
2     2      NaN        2.0  right_only
3     2      NaN        2.0  right_only

【讨论】:

    猜你喜欢
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多