【问题标题】:Merge two data frames with different column names and exclude the equivalent key from the result合并具有不同列名的两个数据框,并从结果中排除等效键
【发布时间】:2020-01-01 21:02:45
【问题描述】:

我有两个共享相同键的熊猫数据框,但每个对象的名称不同。

df = pd.DataFrame({"ID":[1,2,3], "Flag":[0,0,1]})
results = pd.DataFrame({"client_id":[1,2,3], "score":[600,700,800]})
df.columns
Index(['ID', 'Flag'])
results.columns
Index(['client_id', 'score'])

我想将它们合并在一起以将results["score"] 添加到df。我尝试了以下方法:

df = pandas.merge(df, results, left_on="ID", right_on="client_id", how="left")

这很好用,但df 现在有四列:["ID","Flag","client_id","score"]

我只是一头雾水。为什么 merge 会返回第二个数据框的密钥,即使我告诉它 df["ID"]results["client_id"] 是合并的密钥?

预期的结果是:

df.columns
Index(['ID', 'Flag', 'score'])

我使用过的其他 merge 函数不这样做,所以我只是想知道为什么 pandas 这样做。这是否有特定原因(即保留第二个数据框的密钥是否有用?)?

主要问题是:merge 中是否有一个参数可以用来避免这种情况,还是我必须手动排除 df["client_id"]

【问题讨论】:

  • 我在调用x/y problem:请解释为什么您坚持让merge 为您执行整个操作。由于您似乎设置了限制,您只是在抱怨merge 没有按照您想要的方式编写。如果是这种情况,则说明您发布到了错误的网站。
  • 我用过的其他合并函数不这样做(例如,R 中的 merge 函数)。因此,我正在寻找一种解决方案,以避免编写我不必用另一种语言编写的东西。

标签: python pandas merge


【解决方案1】:

为什么merge 会返回第二个数据框的密钥,即使我 告诉它df["ID"]results["client_id"] 是等价的?

你没有说它们是等价的。您告诉 pandas 通过 那些 键匹配这些数据帧。您可能在 df['ID'] 中有 100 万个条目,在 df['client_id'] 中有 100 万个条目,但实际上只有 10 个条目匹配。那么,在这种情况下该怎么办呢?这些列是否等效

根据您合并的how,行为会有所不同。例如,如果您执行 outer 合并,您将得到一个合并的数据框,其中包含 非常非常不同 df['ID']df['client_id'] 列。

作为一个练习,考虑这个例子:

results = pd.DataFrame({"client_id":[1,2,3,4], "score":[600,700,800,900]})

现在,client_id 有第 4 行。在合并how='outer',你得到

    ID  Flag  client_id  score
0  1.0   0.0          1    600
1  2.0   0.0          2    700
2  3.0   1.0          3    800
3  NaN   NaN          4    900

如果没有client_id 列,就很难解释为什么合并后还有第 4 行。


如果您真的想使这些列“等效”(即在合并时删除它们并保留主要列),请将它们重命名为具有相同的名称并使用 on 作为唯一键, 而不是 left_onright_on 键。

pd.merge(df, results.rename(columns={'client_id':'ID'}), on='ID', how='left')

   ID  Flag  score
0   1   0.0    600
1   2   0.0    700
2   3   1.0    800

【讨论】:

    【解决方案2】:

    获得所需内容的直接方法是在合并之前更改一个列名。

    merge 保留两列以涵盖 ID 仅存在于要合并的两个数据帧之一中的情况。有关语义,请参见标准数据库操作。

    简而言之,考虑一下这种情况,ID 不匹配

    df1 = pd.DataFrame({"ID":[1,2,3], "Flag":[0,0,1]})
    df2 = pd.DataFrame({"client_id":[1,2,4], "score":[600,700,800]})
    

    这些列等效;合并的 df 将适当地保留源信息以用于您的任何目的。如果您想要 equivalent 列,您应该给它们相同的名称并确保所有条目都匹配。任何与等效定义的偏差都意味着你,所有正确信息的最高来源,有别的想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-16
      • 2015-03-21
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2021-12-28
      • 1970-01-01
      • 2016-08-12
      相关资源
      最近更新 更多