我有两个数据框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