Python如何基于另一DataFrame的条件返回多列匹配值
正确实现方案
实现思路
- 先预处理DF2规则表:将逗号分隔的Group拆分为单行数据,把Text列的关键词拆分、去空格、转小写生成关键词列表,避免匹配异常
- 将DF1的Text列统一转小写,规避大小写不一致导致的匹配失败问题
- 按Group字段关联DF1和预处理后的规则表,判断DF1的Text是否包含对应规则的关键词(规则无关键词时只要Group匹配就算成功)
- 把匹配到的结果赋值给新增的两个预测列
代码示例
import pandas as pd # ---------------------- 预处理DF2规则表 ---------------------- # 拆分逗号分隔的Group为多行 df2_expanded = DF2.assign(Group=DF2['Group'].str.split(',')).explode('Group') # 去除Group前后多余空格 df2_expanded['Group'] = df2_expanded['Group'].str.strip() # 拆分关键词、去空格、转小写,空值转为空列表 df2_expanded['keywords'] = df2_expanded['Text'].fillna('').str.split(',').apply( lambda x: [kw.strip().lower() for kw in x if kw.strip()] ) # 保留规则所需字段 df2_rules = df2_expanded[['Category', 'Subcategory', 'Group', 'keywords']].reset_index(drop=True) # ---------------------- 预处理DF1待匹配表 ---------------------- DF1['text_lower'] = DF1['Text'].str.lower() # ---------------------- 关联匹配生成预测列 ---------------------- # 按Group关联两个表 df_merged = DF1.merge(df2_rules, on='Group', how='left') # 匹配判断函数 def match_rule(row): # 规则无关键词,只要Group匹配就成功 if not row['keywords']: return pd.Series([row['Category'], row['Subcategory']]) # 检查是否有任意关键词命中 for kw in row['keywords']: if kw in row['text_lower']: return pd.Series([row['Category'], row['Subcategory']]) # 未匹配返回空 return pd.Series([None, None]) # 生成预测列 DF1[['predictedCategory', 'predictedSubcategory']] = df_merged.apply(match_rule, axis=1) # 清理中间辅助列 DF1 = DF1.drop('text_lower', axis=1)
常见返回空值的原因
- 未拆分DF2中逗号分隔的Group,直接用
G1,G5整体和DF1的单个Group值匹配,导致匹配失败 - 未处理大小写,比如DF1的Text是
Blue wrapper,关键词是blue,大小写不一致导致匹配不到 - 关键词拆分后未去空格,比如关键词带前导空格
flavors,匹配时无法命中无空格的文本内容 - 多条件判断时括号优先级写错,导致逻辑判断结果始终为False
内容的提问来源于stack exchange,提问作者Priya Rajagopal
相关产品推荐
相关产品推荐

