Pandas如何根据字典匹配DataFrame多值列提取对应分类
问题背景
- 目标DataFrame为
df1,包含ID、item两列:item列的多个物品名以¥符号分隔,示例取值:chair、desk¥blue chair、bed¥pen¥cable
- 物品分类映射字典
item_dict从CSV读取,存储物品名到分类的对应关系,示例映射:chair对应furniture、mug对应tableware - 需求:在
df1中新增category列,逐行提取当前行item里所有能匹配到字典的物品对应的分类,多个分类用逗号分隔,无匹配项则留空 - 已尝试方案的缺陷:
- 执行
df1['category'] = df1['item'].replace(item_dict)仅能正确处理仅含单个物品的行 - 增加
regex=True参数后可处理多物品行,但会出现子串误匹配问题,比如将desk¥blue chair错误替换为desk¥blue furniture,无法实现“仅保留匹配分类、剔除未匹配物品名”的预期效果
- 执行
实现代码
不要直接用整列正则替换,先按分隔符拆分每行的物品为独立元素,再逐个做精确字典匹配,最后拼接分类结果即可,完全避免子串匹配错误:
def get_matched_categories(item_str, category_map): # 按¥拆分得到单个物品列表,自动去除首尾空格避免格式干扰 items = [i.strip() for i in item_str.split('¥')] # 遍历物品,收集所有存在映射的分类 matched = [category_map[item] for item in items if item in category_map] # 用逗号拼接分类,无匹配时返回空字符串 return ','.join(matched) # 逐行应用函数生成category列 df1['category'] = df1['item'].apply(lambda x: get_matched_categories(x, item_dict))
补充说明
- 先按
¥拆分字符串的逻辑,保证每个匹配单元是完整的物品名,从根源上避免短词子串误匹配的问题 - 字典精确匹配仅返回命中的分类,自动过滤未匹配到的物品,完全符合输出要求
- 若需要对重复分类去重且不要求保留原有顺序,可将匹配逻辑改为
list(set([category_map[item] for item in items if item in category_map]));需要保序去重可以追加遍历判重的逻辑。
内容的提问来源于stack exchange,提问作者illien
相关产品推荐
相关产品推荐

