通过字符串包含匹配字典映射为Pandas DataFrame新建Factor列
问题原因
你使用的map方法执行的是完全等值匹配,而你的需求是df2的Code值作为子串匹配df1的Code值,因此原有代码无法命中匹配。
实现代码
import pandas as pd # 示例数据 df1 = pd.DataFrame({ 'Date':['2021-01-01', '2021-01-01', '2021-01-01', '2021-01-02', '2021-01-02', '2021-01-02', '2021-01-02', '2021-01-03'], 'Ratings':[9.0, 8.0, 5.0, 3.0, 2, 3, 6, 5], 'Code':['R:EST 5R', 'R:EKG EK', 'R:EKG EK', 'R:EST 5R', 'R:EKGP', 'R:EST 5R', 'R:OID_P', 'R:OID_P'] }) df2 = pd.DataFrame({ 'Code':['R:EST', 'R:EKG', 'R:OID'], 'Factor':[1, 1.3, 0.9] }) # 构造Code到Factor的映射字典 code_map = df2.set_index('Code')['Factor'].to_dict() # 构造正则匹配模式,按Code长度降序排列避免短前缀提前匹配 pattern = '|'.join(sorted(code_map.keys(), key=len, reverse=True)) # 提取匹配子串后映射Factor df1['Factor'] = df1['Code'].str.extract(f'({pattern})', expand=False).map(code_map)
运行后df1的输出和你期望的df3完全一致。
逻辑说明
- 先把df2转换为键为Code、值为Factor的字典,提升后续查找效率
- 正则模式按Code长度倒序排列,是为了避免出现短键先匹配的错误:比如如果同时存在
R:EK和R:EKG两个键,会优先匹配更长的R:EKG - 如果存在匹配不到的场景,可以在
map后加fillna(默认值)处理缺失值
内容的提问来源于stack exchange,提问作者fjurt
相关产品推荐
相关产品推荐

