python-3.x 如何合并两个数据框,并保留不是所有的匹配?

ovfsdjhp  于 2023-03-13  发布在  Python
关注(0)|答案(2)|浏览(145)

有2个 Dataframe :第1天:

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

第二天:

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

我怎么能做呢?先谢谢你了

ukdjmx9f

ukdjmx9f1#

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

输出将如下所示。

jhiyze9q

jhiyze9q2#

我认为更新两个数据框将是有效的方法,而不是合并。
这里,我在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)

输出:
第1天

id   city    pos
0   3   NY     M
1   6   LA     D

第二天

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

相关问题