Python:检查DataFrame子串匹配并提取存在的单词列表问题
问题分析与解决方案
原代码错误原因
- 第一段代码:
i in sentence['sentence'].values是检查单词是否完全等于某个句子,而非作为子串存在,只有当单词和句子完全一致时才会被选中,不符合需求。 - 第二段代码:
sentence['sentence'].str.contains(i)返回布尔Series,直接用if判断会触发ValueError(Pandas不允许在布尔上下文直接使用Series),且无法正确判断是否存在至少一个包含该单词的句子。
正确实现方案
方案1:修复循环逻辑
遍历单词表,用any()判断是否存在至少一个句子包含当前单词:
tru = [] for word_val in word['word']: # 检查任意句子是否包含该单词 if sentence['sentence'].str.contains(word_val).any(): tru.append(word_val)
方案2:向量化操作(高效无循环)
利用Pandas的apply和布尔索引直接筛选符合条件的单词:
existing_words = word[word['word'].apply(lambda x: sentence['sentence'].str.contains(x).any())]['word'].tolist()
方案3:精确匹配完整单词(避免部分匹配)
如果需要匹配完整单词(比如避免app匹配apples),可以使用正则单词边界\b:
tru = [] for word_val in word['word']: # 正则匹配完整单词,区分大小写 if sentence['sentence'].str.contains(r'\b' + word_val + r'\b', regex=True).any(): tru.append(word_val)
可选参数说明
- 若需忽略大小写,在
str.contains中添加case=False:sentence['sentence'].str.contains(word_val, case=False).any()
内容的提问来源于stack exchange,提问作者Михаил Беляков
相关产品推荐
相关产品推荐

