从DataFrame文本列移除匹配名称失败,求解决方案
问题分析与修复方案
核心问题:匹配逻辑完全错误
原代码里,对每个单词会遍历所有名称,只要有任意一个名称和单词不匹配,就把单词加入结果列表。这直接导致:
- 就算单词是目标名称,只要存在其他名称和它不匹配,它还是会被多次添加到结果里
- 最终文本里的名称根本没被移除,甚至单词数量会异常增多
修复步骤
1. 优化名称集合,提升查找效率
把名称集合保留为set(查找时间复杂度O(1),比列表的O(n)高效得多),同时统一转小写避免大小写匹配问题:
with open('names.txt', 'r') as f: NAMES = set(name.lower() for name in f.read().splitlines())
2. 修正单词过滤逻辑
对每个单词,只需检查它本身或所有格形式是否在名称集合中,无需遍历所有名称:
def remove_names(df, col, names_set): # 用apply批量处理,符合pandas操作规范,避免索引赋值异常 def filter_word_list(word_list): filtered_words = [] for word in word_list: word_lower = word.lower() # 排除名称本身和名称的所有格形式 if word_lower not in names_set and f"{word_lower}'s" not in names_set: filtered_words.append(word) return filtered_words df[col] = df[col].apply(filter_word_list) return df[col]
3. 调用修正后的函数
df_norm['Full Text'] = remove_names(df_norm, 'Full Text', NAMES)
额外说明
原代码使用df[col][idx]的链式索引赋值,可能触发SettingWithCopyWarning,甚至导致赋值不生效,改用apply是更安全的pandas操作方式。
内容的提问来源于stack exchange,提问作者jack gell
相关产品推荐
相关产品推荐

