我有两个共享相同密钥的熊猫数据帧,但是每个对象的名称不同。
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"]
?
答案 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_on
和right_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 列,则应为它们指定相同的名称,并确保所有条目都匹配。与等价的定义的任何偏离都意味着您,所有正确信息的最高来源,还有一些其他想法。