如何将两个DataFrame中的分类列进行映射匹配?
实现方案
关于映射关系的合理性
你定义的matching_cat是合理的,它清晰建立了父分类到子分类的对应关系,是处理这类分类匹配问题的常规方式,后续新增/修改分类直接调整字典即可,维护成本低。
具体实现步骤
1. 反转分类映射
先把matching_cat从父分类→子分类列表反转成子分类→父分类的字典,方便直接给df2的names值匹配对应分类:
# 生成子分类到父分类的映射字典 name_to_cat = {} for cat, names_list in matching_cat.items(): for name in names_list: name_to_cat[name] = cat
2. 给df2添加对应分类列
利用上面的映射,给df2新增分类列,用于后续和df1的categories做对比:
df2['matched_category'] = df2['names'].map(name_to_cat)
3. 基于key_col合并两个DataFrame
用pd.merge按共同的key_col合并,这里用内连接只保留两个DataFrame都存在的key;如果需要保留df1的所有行,可将how参数改为'left':
merged_df = pd.merge(df1, df2, on='key_col', how='inner')
4. 可选:添加匹配验证列
如果需要快速验证当前categories和names是否符合映射规则,新增一列标记匹配结果:
merged_df['is_match'] = merged_df['categories'] == merged_df['matched_category']
完整代码与运行结果
import pandas as pd data1 = {'key_col': ['12563','12564','12565','12566'], 'categories': ['bird', 'dog', 'insect','insect'],'column3': ['some','other','data','there'] } df1 = pd.DataFrame(data1) data2 = { 'key_col': ['12563','12564','12565','12566','12567'], 'names': ['falcon', 'golden retriever', 'doberman','spider','spider'], 'column_randomn': ['some','data','here','here','here'] } df2 = pd.DataFrame(data2) matching_cat = {'bird': ['falcon', 'toucan', 'eagle'], 'dog': ['golden retriever', 'doberman'], 'insect':['spider','mosquito'] } # 反转映射 name_to_cat = {} for cat, names in matching_cat.items(): for name in names: name_to_cat[name] = cat # 给df2添加分类列 df2['matched_category'] = df2['names'].map(name_to_cat) # 合并DataFrame merged_df = pd.merge(df1, df2, on='key_col', how='inner') # 添加匹配验证列 merged_df['is_match'] = merged_df['categories'] == merged_df['matched_category'] print(merged_df)
运行输出:
key_col categories column3 names column_randomn matched_category is_match 0 12563 bird some falcon some bird True 1 12564 dog other golden retriever data dog True 2 12565 insect data doberman here dog False 3 12566 insect there spider here insect True
结果中is_match列会直接标记该行的分类与子分类是否匹配,方便快速定位异常数据。
内容的提问来源于stack exchange,提问作者yoopiyo
相关产品推荐
相关产品推荐

