如何在Pandas中实现关键词全匹配筛选DataFrame行?
解决DataFrame完整关键词匹配筛选问题
你的核心问题是代码里用了all(...)判断,这要求df1中的所有关键词都出现在df2的行中才会标记匹配,但你的需求是只要包含任意一个完整关键词即可,把all换成any就能解决问题。
修正后的代码(基于你的原有思路)
import pandas as pd df1 = pd.DataFrame( { "Keywords": ["SYS", "SYS2", "SYS3"] } ) df2 = pd.DataFrame( { "Lookup": ["TEST SYSTEM", "SYS", "DUMMY" , "THIS IS SYS3"] } ) # 提取关键词列表 findwords = df1['Keywords'].tolist() # 将Lookup列拆分为单词集合 df2['words'] = df2['Lookup'].str.strip().str.split().apply(set) # 改用any判断:只要存在任意一个关键词即匹配 df2['match'] = df2['words'].apply(lambda words: any(word in words for word in findwords)) # 筛选匹配行并提取结果列 lookup_results = df2[df2['match']]['Lookup'].rename('LookupResults') print(lookup_results)
运行后输出符合预期:
1 SYS 3 THIS IS SYS3 Name: LookupResults, dtype: object
更高效的正则表达式方法
如果数据量较大,推荐直接用正则表达式匹配完整单词(\b表示单词边界,避免部分匹配),无需拆分字符串:
import pandas as pd df1 = pd.DataFrame( { "Keywords": ["SYS", "SYS2", "SYS3"] } ) df2 = pd.DataFrame( { "Lookup": ["TEST SYSTEM", "SYS", "DUMMY" , "THIS IS SYS3"] } ) # 构建匹配完整单词的正则表达式 pattern = r'\b(' + '|'.join(df1['Keywords'].tolist()) + r')\b' # 直接用str.contains判断匹配 df2['match'] = df2['Lookup'].str.contains(pattern, regex=True) # 提取结果 lookup_results = df2[df2['match']]['Lookup'].rename('LookupResults') print(lookup_results)
这个方法更简洁,且能精准避免"TEST SYSTEM"这类包含关键词子串的情况被误匹配。
内容的提问来源于stack exchange,提问作者user19778438
相关产品推荐
相关产品推荐

