基于Pandas DataFrame描述列匹配字典值生成分类列的问题
问题解决:Pandas根据关键词映射分类标签
问题背景
现有如下结构的Pandas DataFrame:
name Description ABC 'Verdansk was the best' EDF 'Pro Clubs with the lads' LMN 'Being Druid was the best' RST 'The game of FIFA23' XYZ 'Switch on for Bio lab drop' ... ....
以及分类字典:
categories = { "CALL_OF_DUTY":["Verdansk","Bio Lab"], "WORLD_OF_WARCRAFT":["Druid","Rogue"], "FIFA": ["Pro Clubs", "FIFA"] }
需求:若DataFrame的Description列中出现字典values里的任意关键词,则将对应的字典key作为该行的category列值,期望输出:
name Description category ABC 'Verdansk was the best' 'CALL_OF_DUTY' EDF 'Pro Clubs with the lads' 'FIFA' LMN 'Being Druid was the best' 'WORLD_OF_WARCRAFT' RST 'The game of FIFA23' 'FIFA' XYZ 'Switch on for Bio lab drop' 'CALL_OF_DUTY' ... ....
现有代码问题分析
你尝试的代码无法正确返回分类key,核心问题有两点:
categories.values()返回的是嵌套列表,直接用'|'.join()会报错(join要求元素是字符串,不能直接拼接列表);- 就算提取到关键词,
map(categories)是用关键词去匹配原字典的key,但原字典的key是分类名,value才是关键词列表,因此无法映射出正确的分类,只会返回NaN。
解决方案
方法1:反转字典+正则提取映射
先将原分类字典反转,生成关键词→分类的映射关系,再通过正则提取关键词并映射分类:
# 反转字典,构建关键词到分类的映射 keyword_to_cat = {} for category, keywords in categories.items(): for kw in keywords: # 统一转小写,实现忽略大小写匹配 keyword_to_cat[kw.lower()] = category # 提取关键词并映射分类(去掉\b以适配FIFA23这类包含关键词的场景) df['category'] = df['Description'].str.extract( fr"({'|'.join(keyword_to_cat.keys())})", re.IGNORECASE )[0].str.lower().map(keyword_to_cat)
说明:
- 反转字典后,每个关键词直接对应所属分类,解决了原字典无法反向映射的问题;
- 移除正则中的
\b,可以匹配像FIFA23这类包含关键词的文本,符合需求中的示例场景。
方法2:遍历匹配(直观易懂)
通过apply遍历每一行描述,检查是否包含某个分类的关键词,返回对应分类:
def match_category(desc): desc_lower = desc.lower() for cat, keywords in categories.items(): for kw in keywords: if kw.lower() in desc_lower: return cat return None # 无匹配时返回None df['category'] = df['Description'].apply(match_category)
说明:
- 逻辑直观,适合关键词无重叠的场景(若有重叠,会返回第一个匹配的分类);
- 自动忽略大小写,无需额外处理正则规则。
内容的提问来源于stack exchange,提问作者Turb
相关产品推荐
相关产品推荐

