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

如何用gensim/spacy/nltk过滤DataFrame单列中的英文停用词

问题原因与解决方法

首先你的代码报错和逻辑错配的核心原因:

  • 你当前words列每行存储的是单个独立英文词汇,你在lambda中对单个字符串执行" ".join(x),如果数据存在NaN空值,空值不属于可迭代对象,就会触发对应TypeError
  • 逻辑不符合需求:你要实现的是过滤掉属于停用词的行,而remove_stopwords是用来处理长句/段落,删除句子内部停用词的工具,完全不匹配你的使用场景。

10万+行数据的最优方案是将停用词转为集合后用isin做向量化判断,速度远高于逐行apply,以下是三个常用库的实现方式:


方法1:NLTK实现

import pandas as pd
import nltk
from nltk.corpus import stopwords

# 首次使用需要下载停用词表
nltk.download('stopwords')
# 转集合后查询速度为O(1),适配大数据量
en_stop = set(stopwords.words('english'))

# 先删除空值避免异常
df = df.dropna(subset=['words'])
# 过滤非停用词的行
df = df[~df['words'].isin(en_stop)].reset_index(drop=True)

方法2:Gensim实现

不需要额外下载停用词表,开箱即用:

import pandas as pd
from gensim.parsing.preprocessing import STOPWORDS

df = df.dropna(subset=['words'])
# Gensim的STOPWORDS本身就是集合类型,直接用即可
df = df[~df['words'].isin(STOPWORDS)].reset_index(drop=True)

方法3:spaCy实现

停用词覆盖更全面,适合对分词精度要求高的场景:

import pandas as pd
import spacy

# 加载英文基础模型,未安装的话先执行:pip install spacy && python -m spacy download en_core_web_sm
nlp = spacy.load('en_core_web_sm')
en_stop = nlp.Defaults.stop_words

df = df.dropna(subset=['words'])
df = df[~df['words'].isin(en_stop)].reset_index(drop=True)

补充:如果后续你需要处理句子格式的words列

如果words列每行存储的是完整句子,要删除句子内部的停用词,可以用以下写法:

from gensim.parsing.preprocessing import remove_stopwords

# 先统一转字符串类型避免空值报错
df['words'] = df['words'].astype(str).apply(remove_stopwords)
# 过滤处理后为空的行
df = df[df['words'].str.strip() != ''].reset_index(drop=True)

内容的提问来源于stack exchange,提问作者AJ.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 09:24:03