如何用Python/Pandas字典推导式结合str.contains实现课程名部分匹配映射
实现支持部分匹配的课程类别映射
没问题,这就教你怎么搞定这个支持部分字符串匹配的课程分类需求!针对你的场景,我给你两种实用的方案,都能完美适配你那35个键值对的映射字典:
方案一:循环遍历映射(直观易懂)
这种方法逻辑直白,适合新手理解,而且35个键的规模完全不会有性能问题:
import pandas as pd # 你的原始数据和映射字典 df = pd.DataFrame({'course_name' : ['Phsyics, Maths','Algebra & Maths','History','Geology','Biology']}) mapping = {'Algebra & Maths' : 'Mathematics', 'Phsyics' : 'Science', 'History' : 'History', 'Geology' : 'Geology', 'Biology' : 'Science'} # 先初始化类别列,给未匹配的课程留个默认值 df['category'] = 'Other' # 遍历映射字典的每个键值对,做部分匹配赋值 for course_pattern, target_category in mapping.items(): # 生成匹配掩码:检查课程名是否包含当前模式 # case=False 忽略大小写,na=False 把NaN值归为不匹配 match_mask = df['course_name'].str.contains(course_pattern, case=False, na=False) # 给匹配到的行赋值对应类别 df.loc[match_mask, 'category'] = target_category # 查看结果 print(df)
运行后你会得到这样的结果:
course_name category 0 Phsyics, Maths Science 1 Algebra & Maths Mathematics 2 History History 3 Geology Geology 4 Biology Science
方案二:字典推导式 + np.select(更简洁)
如果你想用字典推导式来实现,结合numpy.select可以一次性完成所有匹配,代码更紧凑:
import pandas as pd import numpy as np df = pd.DataFrame({'course_name' : ['Phsyics, Maths','Algebra & Maths','History','Geology','Biology']}) mapping = {'Algebra & Maths' : 'Mathematics', 'Phsyics' : 'Science', 'History' : 'History', 'Geology' : 'Geology', 'Biology' : 'Science'} # 用字典推导式生成所有匹配条件的列表 match_conditions = [ df['course_name'].str.contains(pattern, case=False, na=False) for pattern in mapping.keys() ] # 提取映射字典里的类别值列表 category_values = list(mapping.values()) # 使用np.select完成赋值,default是未匹配课程的默认类别 df['category'] = np.select(match_conditions, category_values, default='Other') print(df)
关键注意事项
- 匹配优先级:不管用哪种方法,映射字典的键顺序很重要!如果一个课程能匹配多个键(比如假设你后来加了'Maths'的映射),排在前面的键会先被匹配。所以记得把更具体的匹配(比如完全匹配的课程名)放在字典的前面,避免被宽泛的模式提前匹配。
- 大小写控制:如果需要严格区分大小写,去掉
str.contains里的case=False参数就行。 - NaN处理:
na=False确保如果课程名是NaN的话,会被归为默认的'Other',你可以根据需求调整这个参数。
内容的提问来源于stack exchange,提问作者Umar.H
相关产品推荐
相关产品推荐

