如何合并两个数据框并保留非全部匹配项?

4

有两个数据框:

d1:

id    city     position
1     NY       manager
2     NY        manager
3     NY        manager
4     NY        Engineer
5     LA        Engineer
6     LA        Designer

d2:

team    city     position
a           NY       manager
a          NY        manager
b          NY        Engineer
b          LA        Engineer

我需要通过“城市”和“职位”左连接d1和d2,但是我不想保留所有匹配项。d1的形状不应该改变。但是当我这样做时:

d1.merge(d2, how = "left", on = ["city", "position"])

我得到了所有可能的匹配项,但我需要选择其中一些并保持d1的形状不变

所以期望的结果是:

team    city     position        id  
a           NY       manager      1
a          NY        manager      2
b          NY        Engineer     4
b          LA        Engineer     5

df1必须被更新并变成这样:

id    city     position
3     NY        manager
6     LA        Designer

我该怎么做呢?提前感谢。

2个回答

0
desired_output = d2.merge(d1, how = "left", on = ["city", "position"]).drop_duplicates()
d1 = d1[~d1['id'].isin(desired_output['id'].values)]

输出将如下所示。 输入图像描述

0

我认为更新两个数据框将比合并更有效。

在这里,我循环遍历 d2 并执行两个步骤:

  • 使用相似的城市和位置筛选表格,取第一行 id,并更新 d2
  • 通过删除包含接收到的 id 的行来更新 d1

代码:

d2['id'] = None
def up( c,p):
    global d1
    id_val = list(d1[(d1['city'] == c) & (d1['pos'] == p)]['id'])
    d1 = d1[~d1['id'].eq(id_val[0])].reset_index(drop=True)
    return id_val[0]

 
d2['id'] = d2.apply(lambda r: r.id if r.id else up( r.city, r.pos), axis=1)
    
print(d2)
print(d1)

输出:

d1

   id   city    pos
0   3   NY     M
1   6   LA     D

d2

  team  city pos    id
0   a   NY   M      1
1   a   NY   M      2
2   b   NY   E      4
3   b   LA   E      5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接