Pandas生成匹配关键词的DataFrame新列时陷入无限处理问题
问题分析与解决方案
你的代码陷入无限处理状态,核心是以下几个问题:
原代码的问题
- 列名拼写错误:把
Sandwich Opinions误写为Sandwich iOpinions,直接导致目标列无法识别,更关键的是逻辑层面的错误。 - 逻辑错误:在
apply的lambda函数里,你遍历的是整个列的拆分结果(df['Sandwich Opinions'].str.split()),而非当前行的文本。这会让每一行都重复处理所有行的数据,加上apply本身逐行执行的特性,导致大量冗余计算,效率极低甚至看起来像无限循环。 - 语法错误:最后一行括号不匹配,外层多余的
[]和未闭合的apply调用括号,会直接导致代码无法正常解析。
正确实现方式
方法1:逐行处理(简单直观)
先将关键词转为集合提升匹配效率,再针对每行文本拆分后匹配:
import pandas as pd data = { 'Sandwich Opinions': ['Roast beef is overrated', 'Toasted bread is always best', 'Hot sandwiches are better than cold'] } df = pd.DataFrame(data) keywords = ['bread', 'bologna', 'toast', 'sandwich'] keyword_set = set(word.lower() for word in keywords) # 统一小写,支持忽略大小写匹配 # 逐行处理当前文本,拆分后筛选匹配的关键词并拼接 df['Matches'] = df['Sandwich Opinions'].apply( lambda text: ' '.join([word for word in text.split() if word.lower() in keyword_set]) )
运行后输出结果:
| Sandwich Opinions | Matches |
|---|---|
| Roast beef is overrated | |
| Toasted bread is always best | bread |
| Hot sandwiches are better than cold |
方法2:向量化处理(高效适配大数据)
使用正则表达式的向量化操作,比apply逐行处理效率更高:
import pandas as pd import re data = { 'Sandwich Opinions': ['Roast beef is overrated', 'Toasted bread is always best', 'Hot sandwiches are better than cold'] } df = pd.DataFrame(data) keywords = ['bread', 'bologna', 'toast', 'sandwich'] # 构建匹配完整单词的正则表达式,忽略大小写 pattern = r'\b(' + '|'.join(keywords) + r')\b' # 提取所有匹配的词并拼接成字符串 df['Matches'] = df['Sandwich Opinions'].str.findall(pattern, flags=re.IGNORECASE).str.join(' ')
如果需要匹配词根(比如sandwiches匹配sandwich),可以额外增加词形还原处理;若仅需精确匹配(忽略大小写),以上两种方法即可满足需求。
内容的提问来源于stack exchange,提问作者Michael Kessler
相关产品推荐
相关产品推荐

