如何匹配两个DataFrame的name列,为df2添加对应df1的id列
解决Pandas匹配DataFrame并添加对应ID的问题
原代码问题说明
你当前的遍历代码里,if (row["name"],) in TypeNameList:的判断逻辑有误——TypeNameList是字符串列表,而(row["name"],)是元组,永远无法匹配,所以不会执行后续操作。
推荐解决方案(高效简洁)
Pandas原生的关联操作比手动遍历高效得多,这里提供两种最优方法:
方法1:使用merge左连接(推荐)
直接通过merge按name列关联两个DataFrame,保留df2的所有行,匹配不上的ID自动为空:
# 仅保留df1中需要的name和id列,左连接df2 df2 = df2.merge(df1[['name', 'id']], on='name', how='left')
执行后df2就会得到你需要的结构,未匹配的id列值为NaN(空值)。
方法2:使用map映射
先构建name到id的字典,再映射到df2的name列:
# 创建name对应id的字典 name_id_map = df1.set_index('name')['id'].to_dict() # 给df2添加id列,匹配不到则返回空 df2['id'] = df2['name'].map(name_id_map)
修正后的遍历方法(不推荐,仅适配你的原有思路)
如果一定要用遍历实现,需要修正判断逻辑,并提前构建映射字典提升效率:
# 先初始化id列为空 df2['id'] = None # 构建name到id的映射字典,避免循环内重复查询 name_id_dict = df1.set_index('name')['id'].to_dict() TypeNameList = df1['name'].tolist() for index, row in df2.iterrows(): current_name = row['name'] if current_name in TypeNameList: # 给当前行的id列赋值 df2.loc[index, 'id'] = name_id_dict[current_name]
内容的提问来源于stack exchange,提问作者BlakeB9
相关产品推荐
相关产品推荐

