合并两个具有不同列名的数据框,并从结果中排除等效键

时间:2019-08-28 15:25:13

标签: python pandas merge

我有两个共享相同密钥的熊猫数据帧,但是每个对象的名称不同。

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"]

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

预期结果将是:

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

我使用的其他merge函数没有执行此操作,因此我只是想知道为什么pandas会这样做。是否有特定原因(即保持第二个数据帧的密钥有用吗?)?

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

2 个答案:

答案 0 :(得分:3)

  

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

您没有告诉他们它们是等效的。您告诉熊猫通过那些键匹配这些数据框。可能的情况是,您在df['ID']中有1百万个条目,在df['client_id']中有1百万个条目,但是实际上只有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列的情况下,很难解释为什么合并后还有第四行。


如果您真的想使这些列为“等效” (即在合并时将其删除并保留主导列),请重命名它们以使用相同的名称,并使用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

答案 1 :(得分:1)

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

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 列,则应为它们指定相同的名称,并确保所有条目都匹配。与等价的定义的任何偏离都意味着您,所有正确信息的最高来源,还有一些其他想法。