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

解决Pandas列移除停用词时的ValueError索引长度不匹配问题

问题分析与修复方案

嘿,这个错误我之前也踩过坑,核心问题是你写的列表推导式把所有单词都展平成了一个一维列表,而Pandas需要的是每行对应一个过滤后的单词列表,两者长度不匹配就抛出了这个ValueError。

错误原因详解

你当前的代码:

data['new'] = [word for new in data['new'] for word in new if word not in stopwords]

这个推导式生成的是一个扁平的单词集合——它会遍历data['new']里的每一个列表,然后把所有符合条件的单词都塞进一个大列表里。比如原DataFrame有5行数据,过滤后可能会有几百个单词,这个大列表的长度远大于5,自然和DataFrame的索引长度对不上。

修复代码

你需要把列表推导式改成嵌套结构,给每行的单词列表单独做过滤:

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

data = pd.read_csv(r"D:/python projects/read_files/spam.csv", encoding = "latin-1")
data = data[['v1','v2']]
data = data.rename(columns = {'v1': 'label', 'v2': 'text'})

# 转换为集合提升停用词查找效率
stop_words = set(stopwords.words('english'))
data['text'] = data['text'].str.lower()
data['new'] = [word_tokenize(row) for row in data['text']]

# 正确的嵌套列表推导式:为每行生成一个过滤后的单词列表
data['new'] = [[word for word in row if word not in stop_words] for row in data['new']]

更简洁的Pandas风格写法

你也可以用Pandas的apply方法,代码逻辑更直观,符合Pandas的使用习惯:

data['new'] = data['new'].apply(lambda row: [word for word in row if word not in stop_words])

验证效果

运行后,data['new'].head(5)会输出每行过滤停用词后的单词列表,比如第一行的until、only这类停用词会被移除,结果大致如下:

0    [go, jurong, point, ,, crazy.., available, bugis, n, great, world, la, e, buffet, ...]
1    [ok, lar, ..., joking, wif, u, oni, ...]
2    [free, entry, 2, wkly, comp, win, fa, cup, final, tkts, 21st, may, 2005, text, fa, ...]
3    [u, dun, say, early, hor, ..., u, c, already, say, ...]
4    [nah, n't, think, goes, usf, lives, around, though, ...]
Name: new, dtype: object

这样就完全匹配DataFrame的行数,不会再抛出长度不匹配的错误啦。

内容的提问来源于stack exchange,提问作者random student

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 17:23:16