Pandas如何跨DataFrame映射值实现TagID到对应Genre转换
Pandas 跨DataFrame批量映射标签ID实现方案
核心思路
先把存储ID-映射值关系的表转成查询字典,再对待匹配表中按空格拼接的ID串做拆分、逐值匹配、拼接,就能得到需要的结果。字典查询时间复杂度为O(1),数据量大的时候性能远高于多表关联。
实现步骤
- 构建ID到流派的映射字典
import pandas as pd # 从映射关系表a生成查询字典 tag_to_genre = dict(zip(a['TagID'], a['Genre']))
- 逐行处理待匹配表b的Tags字段
b的Tags字段是空格分隔的多ID字符串,需要先拆分再匹配,最后拼接成要求的逗号分隔格式:
def match_genre(tag_str): # 拆分空格分隔的ID,统一转为整数类型匹配 tag_id_list = [int(tid) for tid in tag_str.split()] # 逐个匹配对应流派,若存在未覆盖的ID可将tag_to_genre[tid]替换为tag_to_genre.get(tid, '默认流派')避免报错 matched_genre = [tag_to_genre[tid] for tid in tag_id_list] # 拼接为逗号分隔的字符串 return ', '.join(matched_genre) # 生成结果列 output = b[['Tags']].copy() output['Genre'] = output['Tags'].apply(match_genre) # 提取最终需要的输出结构 final_result = output[['Genre']]
可选:无自定义函数实现方案
如果偏好纯Pandas内置方法,可以用explode拆分后关联再聚合的方式实现,逻辑更直观:
# 拆分ID并展开为多行 temp = b.assign(Tags=b['Tags'].str.split()).explode('Tags') # 统一ID字段类型 temp['Tags'] = temp['Tags'].astype(int) # 关联映射表 temp = temp.merge(a, left_on='Tags', right_on='TagID', how='left') # 按原行索引聚合格式化为要求的字符串 final_result = temp.groupby(level=0)['Genre'].agg(lambda x: ', '.join(x.dropna())).to_frame('Genre')
注意:样例数据中a表仅包含TagID 0-4的映射,b表待匹配ID为154、20/35/40/65,只要实际a表包含这些ID的对应Genre值,运行上述代码就能直接得到预期结果结构。
内容的提问来源于stack exchange,提问作者Ririn
相关产品推荐
相关产品推荐

