Python/pandas实现文本匹配数组关键词并提取对应值的方法
问题根因
你写的匹配函数存在缩进错误:return False被写在了for循环内部,程序只会检查关键词列表里的第一个词:如果第一个词命中就返回,没命中就直接返回False,完全不会遍历后续的关键词,所以结果不符合预期。
实现方案
1. 修复后的循环写法(小数据量可用)
只需要把return False移到for循环外部,等所有关键词都遍历完成、确认没有命中之后再返回False即可:
import pandas as pd data = ['sukuna', 'vessel', 'itadori', 'megumi'] s = pd.Series(data) keywords = ['uku', 'ita', 'egu', 'rrr'] def match_keyword(text): for kw in keywords: if kw in text: return kw # 所有关键词遍历完无匹配才返回False return False print(s.apply(match_keyword))
运行输出:
0 uku 1 False 2 ita 3 egu dtype: object
2. 向量化高效写法(推荐,适合大规模数据)
你提到数据规模增大后需要更高的处理效率,apply本质是Python层循环,十万行以上数据处理速度较慢,推荐用pandas原生字符串向量化方法,底层由C实现,性能是循环写法的5~10倍:
import pandas as pd import re data = ['sukuna', 'vessel', 'itadori', 'megumi'] s = pd.Series(data) keywords = ['uku', 'ita', 'egu', 'rrr'] # 拼接正则匹配规则,自动转义关键词里的特殊字符避免报错 pattern = '|'.join(re.escape(kw) for kw in keywords) # 提取第一个命中的关键词,未命中的填充为False result = s.str.extract(f'({pattern})', expand=False).fillna(False) print(result)
这个写法的匹配逻辑和你之前用的Excel公式完全一致:按照关键词列表的顺序检索,返回第一个匹配到的关键词,无匹配返回False,不需要文本有固定格式,适配无规律文本场景。
效果验证
用你给出的动物关键词示例测试:
test_s = pd.Series(['a quick brown', 'cute dog puppy', 'nice cat', 'he saw a lion']) test_keywords = ['dog', 'cat', 'lion'] test_pattern = '|'.join(re.escape(kw) for kw in test_keywords) test_result = test_s.str.extract(f'({test_pattern})', expand=False).fillna(False) print(test_result)
输出完全符合预期:
0 False 1 dog 2 cat 3 lion dtype: object
内容的提问来源于stack exchange,提问作者Bojji
相关产品推荐
相关产品推荐

