我有两个数据框A和B,并且我想在两个数据框的名称列之间进行匹配
如果名称存在于数据集B中,那么我需要使用数据集B的ID在数据集A中创建一个新列,如果不存在则返回0

这是我写的代码

#data B
    email              name        id
    hi@amal.com       amal call     6
    hi@hotmail.com      amal        6
    hi@gmail.com        AMAL boy    6
    hi@boy.com          boy         7
    hi@hotmail.com      boy         7
    hi@call.com     call AMAL       9
    hi@hotmail.com      boy         7
    hi@dog.com          dog         8
    hi@outlook.com      dog         8
    hi@gmail.com        dog         8



#data A

    id  name
    1   amal
    1   AMAL
    2   call
    4   dog
    3   boy



首先我创建包含功能

A.name.str.contains('|'.join(B.name))

然后我尝试创建一列

A["new"] = np.where(A.name.str.contains('|'.join(B.name))==True, B.id, 0)

但是我得到这个错误

ValueError: operands could not be broadcast together with shapes (5,) (10,) ()

我所期望的是

    id  name  new
    1   amal  6
    1   AMAL  0
    2   call  0
    4   dog   7
    3   boy   8



有什么帮助吗?

最佳答案

通过系列使用Series.map,并用DataFrame.drop_duplicates删除重复的行,然后用Series.fillna替换缺少的值并转换为整数:

A["new"] = A.name.map(B.drop_duplicates('name').set_index('name')['id']).fillna(0).astype(int)
print (A)
   id  name  new
0   1  amal    6
1   1  AMAL    0
2   2  call    0
3   4   dog    8
4   3   boy    7

07-24 09:52
查看更多