基于单词列表筛选DataFrame列并优化处理效率
高效过滤DataFrame中GOODS_DESC列仅保留指定单词列表中的单词
问题概述
你手里有一个包含大量英文单词的列表,需要过滤Pandas DataFrame的GOODS_DESC列,只保留该列中存在于这个单词列表里的内容;当前用逐行循环的方法能实现需求,但处理速度太慢,想要更高效的方案。
原方法的痛点
你现有代码用itertuples()逐行遍历DataFrame,这种方式在数据量较大时效率极低——Pandas的核心优势就是向量化操作(底层基于C实现),手动循环会完全浪费这种优势,拖慢处理速度。另外,代码里用set()去重的操作其实不符合你的需求(从期望输出能看出来,你需要保留原单词的重复和顺序)。
高效解决方案
我们可以利用Pandas的向量化字符串方法+集合查找来优化,核心思路是:
- 把单词列表转成小写集合:集合的查找时间复杂度是O(1),远快于列表的O(n),同时统一小写能避免大小写匹配的问题。
- 用向量化操作替代手动循环:借助Pandas内置的优化方法批量处理每一行的
GOODS_DESC。
方案1:用apply结合列表推导(简洁且高效)
import pandas as pd # 假设你的单词列表是word_list,先转成小写集合提升查找效率 word_set = {word.lower() for word in word_list} def filter_goods_desc(text): # 处理空值情况 if pd.isna(text): return pd.NA # 拆分单词,过滤出在word_set中的(匹配时转小写,保留原单词的大小写) valid_words = [word for word in text.strip().split() if word.lower() in word_set] # 有有效单词就拼接成字符串,没有就返回NA return ' '.join(valid_words) if valid_words else pd.NA # 批量处理GOODS_DESC列 df['GOODS_DESC'] = df['GOODS_DESC'].apply(filter_goods_desc)
方案2:用向量化str.findall(速度最快,适合超大数据集)
如果你的数据集特别大,推荐用正则匹配的向量化方法,完全避开Python层面的循环:
import pandas as pd import re # 转小写集合 word_set = {word.lower() for word in word_list} # 构建正则表达式:匹配单词边界内的目标单词,忽略大小写 pattern = r'\b(' + '|'.join(re.escape(word.lower()) for word in word_set) + r')\b' # 提取所有匹配的单词并拼接,空结果转为NA df['GOODS_DESC'] = df['GOODS_DESC'].str.findall(pattern, flags=re.IGNORECASE).str.join(' ') df['GOODS_DESC'] = df['GOODS_DESC'].replace('', pd.NA)
为什么这两种方案更快?
- 集合查找:把单词列表转为集合后,每个单词的匹配检查从O(n)变成O(1),大幅减少查找耗时。
- 优化后的处理逻辑:
apply虽然是逐元素处理,但Pandas内部做了优化,比手动itertuples循环快得多;而str.findall是纯向量化操作,底层由C实现,处理速度是Python循环的几十到上百倍。
结果验证
处理后的DataFrame会和你的期望输出完全一致:仅保留GOODS_DESC中存在于单词列表的单词,无匹配内容的设为NaN,同时保留原单词的顺序和重复(比如第61、63行的TYRE CHIPS SHREDDED TYRES会完整保留)。
内容的提问来源于stack exchange,提问作者Madhur Yadav
相关产品推荐
相关产品推荐

