如何匹配两个DataFrame的Number字段并追加对应Id集合
如何匹配两个DataFrame的Number字段并追加对应Id集合
我来帮你搞定这个需求,思路其实很清晰:先把df1里每个Number对应的Id集合整理好,再去df2里逐个匹配每个Number列表对应的Id,最后把结果合并进去就行。
先回顾下我们的源数据:
import pandas as pd df1 = pd.DataFrame({ 'Id': {0: 101, 1: 102, 2: 103, 3: 104}, 'Number': {0: 'A1', 1: 'A2', 2: 'B1', 3: 'B1'}}) df2 = pd.DataFrame({ 'Client': {0: 'John', 1: 'Mia', 2: 'Claudia'}, 'Number': {0: ['A1', 'B1'], 1: ['Z4'], 2: ['A2']}})
具体步骤:
构建Number到Id集合的映射字典
先把df1按Number分组,把每个分组里的Id转成列表,再转成字典,这样我们就能快速通过Number值找到对应的所有Id:number_to_ids = df1.groupby('Number')['Id'].apply(list).to_dict() # 结果是:{'A1': [101], 'A2': [102], 'B1': [103, 104]}定义匹配函数
写一个小函数,输入df2里的Number列表,遍历每个元素去映射字典里找对应的Id,把所有结果合并成一个扁平列表;如果没有任何匹配的,就返回NaN:def get_matching_ids(num_list): ids = [] for num in num_list: if num in number_to_ids: ids.extend(number_to_ids[num]) return ids if ids else pd.NA生成新的Ids列
把这个函数用apply方法作用到df2的Number列上,生成新的Ids列:df2['Ids'] = df2['Number'].apply(get_matching_ids)
最终结果:
运行完上面的代码后,df2就会变成你想要的样子:
Client Number Ids 0 John [A1, B1] [101, 103, 104] 1 Mia [Z4] <NA> 2 Claudia [A2] [102]
这样就完美实现了需求,而且逻辑清晰,处理了没有匹配项的边界情况~
备注:内容来源于stack exchange,提问作者nzskra
相关产品推荐
相关产品推荐

