如何用index df关键词匹配main df的product列并新增keyword列
问题解决:DataFrame关键词匹配赋值错误
错误原因
你当前的代码逻辑存在问题:循环中仅计算了每行匹配关键词的mask,但未根据mask为对应行分配关键词;循环结束后直接将最后一个遍历的关键词E220F赋值给整个keyword列,导致所有行都显示该值。
解决方案
方案1:循环内根据mask赋值
先初始化keyword列,再在循环中为匹配到的行赋值对应关键词:
# 初始化keyword列为空值 df_import_tmp0['keyword'] = None # 从index df提取关键词列表 key_word = index_df['product'].tolist() for key in key_word: mask = df_import_tmp0["product"].str.contains(key) # 为匹配成功的行赋值当前关键词 df_import_tmp0.loc[mask, 'keyword'] = key
方案2:使用apply函数(更简洁)
通过apply逐行检查并返回匹配的关键词:
key_word = index_df['product'].tolist() def match_keyword(product_str): for key in key_word: if key in product_str: return key return None df_import_tmp0['keyword'] = df_import_tmp0['product'].apply(match_keyword)
方案3:正则提取(效率更高)
将关键词拼接为正则表达式,用str.extract直接提取匹配内容:
import re # 转义关键词避免正则语法冲突,再拼接成匹配规则 pattern = '|'.join(re.escape(key) for key in index_df['product'].tolist()) df_import_tmp0['keyword'] = df_import_tmp0['product'].str.extract(f'({pattern})', expand=False)
验证结果
执行任意方案后,main df的keyword列将正确显示为[C2, VA, E220F, 7350M]。
内容的提问来源于stack exchange,提问作者Tony Lin
相关产品推荐
相关产品推荐

