You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于单词列表筛选DataFrame列并优化处理效率

高效过滤DataFrame中GOODS_DESC列仅保留指定单词列表中的单词

问题概述

你手里有一个包含大量英文单词的列表,需要过滤Pandas DataFrame的GOODS_DESC列,只保留该列中存在于这个单词列表里的内容;当前用逐行循环的方法能实现需求,但处理速度太慢,想要更高效的方案。

原方法的痛点

你现有代码用itertuples()逐行遍历DataFrame,这种方式在数据量较大时效率极低——Pandas的核心优势就是向量化操作(底层基于C实现),手动循环会完全浪费这种优势,拖慢处理速度。另外,代码里用set()去重的操作其实不符合你的需求(从期望输出能看出来,你需要保留原单词的重复和顺序)。

高效解决方案

我们可以利用Pandas的向量化字符串方法+集合查找来优化,核心思路是:

  1. 把单词列表转成小写集合:集合的查找时间复杂度是O(1),远快于列表的O(n),同时统一小写能避免大小写匹配的问题。
  2. 用向量化操作替代手动循环:借助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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:04:37