Python ValueError:值的长度与嵌套循环中索引的长度不匹配

Python ValueError:值的长度与嵌套循环中索引的长度不匹配,python,pandas,for-loop,nltk,list-comprehension,Python,Pandas,For Loop,Nltk,List Comprehension,我正在尝试删除我列中每一行的stopwords。列包含行和行,因为我已经用nltk标记了它,现在它是一个包含元组的列表。我试图用这个嵌套列表删除stopwords,但它显示ValueError:值的长度与嵌套循环中索引的长度不匹配。如何解决这个问题 import pandas as pd from nltk.corpus import stopwords from nltk.tokenize import word_tokenize data = pd.read_csv(r"D:/python

我正在尝试删除我列中每一行的stopwords。列包含行和行,因为我已经用
nltk
标记了它,现在它是一个包含元组的列表。我试图用这个嵌套列表删除stopwords,但它显示
ValueError:值的长度与嵌套循环中索引的长度不匹配
。如何解决这个问题

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'})

stopwords = set(stopwords.words('english'))

data['text'] = data['text'].str.lower()
data['new'] = [word_tokenize(row) for row in data['text']]
data['new'] = [word for new in data['new'] for word in new if word not in stopwords]
我的文本数据

data['text'].head(5)
Out[92]: 
0    go until jurong point, crazy.. available only ...
1                        ok lar... joking wif u oni...
2    free entry in 2 a wkly comp to win fa cup fina...
3    u dun say so early hor... u c already then say...
4    nah i don't think he goes to usf, he lives aro...
Name: text, dtype: object
在i
word\u使用nltk标记后

data['new'].head(5)
Out[89]: 
0    [go, until, jurong, point, ,, crazy.., availab...
1             [ok, lar, ..., joking, wif, u, oni, ...]
2    [free, entry, in, 2, a, wkly, comp, to, win, f...
3    [u, dun, say, so, early, hor, ..., u, c, alrea...
4    [nah, i, do, n't, think, he, goes, to, usf, ,,...
Name: new, dtype: object
追溯

runfile('D:/python projects/NLP_nltk_first.py', wdir='D:/python projects')
Traceback (most recent call last):

  File "D:\python projects\NLP_nltk_first.py", line 36, in <module>
    data['new'] = [new for new in data['new'] for word in new if word not in stopwords]

  File "C:\Users\Ramadhina\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3487, in __setitem__
    self._set_item(key, value)

  File "C:\Users\Ramadhina\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3564, in _set_item
    value = self._sanitize_column(key, value)

  File "C:\Users\Ramadhina\Anaconda3\lib\site-packages\pandas\core\frame.py", line 3749, in _sanitize_column
    value = sanitize_index(value, self.index, copy=False)

  File "C:\Users\Ramadhina\Anaconda3\lib\site-packages\pandas\core\internals\construction.py", line 612, in sanitize_index
    raise ValueError("Length of values does not match length of index")

ValueError: Length of values does not match length of index
runfile('D:/python项目/NLP\u nltk\u first.py',wdir='D:/python项目')
回溯(最近一次呼叫最后一次):
文件“D:\python projects\NLP\u nltk\u first.py”,第36行,在
数据['new']=[new for new in data['new']for word in new if word not in stopwords]
文件“C:\Users\Ramadhina\Anaconda3\lib\site packages\pandas\core\frame.py”,第3487行,在uu setitem中__
自我设置项目(键、值)
文件“C:\Users\Ramadhina\Anaconda3\lib\site packages\pandas\core\frame.py”,第3564行,位于集合项中
value=self.\u清理\u列(键,值)
文件“C:\Users\Ramadhina\Anaconda3\lib\site packages\pandas\core\frame.py”,第3749行,在_sanitize_列中
值=清理索引(值,self.index,copy=False)
文件“C:\Users\Ramadhina\Anaconda3\lib\site packages\pandas\core\internals\construction.py”,第612行,在sanitize\u索引中
raise VALUERROR(“值的长度与索引的长度不匹配”)
ValueError:值的长度与索引的长度不匹配

仔细阅读错误消息:

ValueError:值的长度与索引的长度不匹配

本例中的“值”是
=
右侧的内容:

values=[word for new in data['new']for word in new if word not in stopwords]
本例中的“索引”是数据帧的行索引:

index=data.index
此处的
索引
的行数始终与数据帧本身的行数相同

问题在于
值对于
索引来说太长,即对于数据帧来说太长。如果你检查你的代码,这应该是显而易见的。如果仍然没有发现问题,请尝试以下操作:

data['text\u tokenized']=[word\u tokenize(行)表示数据中的行['text']]
值=[word for new in data['text_tokenized']for word in new if word not in StopWord]
打印('N行:',data.shape[0])
打印('N个新值:',len(值))
至于如何解决这个问题,这完全取决于你想要实现什么。一个选项是“分解”数据(还请注意使用
.map
而不是列表):

data['text\u tokenized']=data['text'].map(word\u tokenize)
#在没有嵌套列表的情况下展平令牌列表
tokens_flat=data['text_tokenized'].explode()
#如果需要,将标签与展平的令牌连接起来
data_flat=data['label']]。连接(令牌_flat)
#添加第二个索引级别以跟踪令牌外观顺序,
#可能会让你的生活更轻松
data\u flat['token\u id']=data.groupby(level=0).cumcount()
data\u flat=data\u flat.set\u index('token\u id',append=True)

作为一个不相关的提示,您可以通过只加载所需的列来提高CSV处理效率,如下所示:

data=pd.read\u csv(r“D:/python项目/read\u文件/spam.csv),
encoding=“拉丁语-1”,
usecols=[“v1”,“v2”])

您能提供示例数据吗?请展示完整的回溯。啊,我明白了,非常感谢您的详细解释和非常方便的提示!嗨,暗语者。我找到了你的答案,正在寻找解决我的stackoverflow问题的可能方法。我想我也有类似的问题(循环中的同一个ValueError,带有一个列表)。然而,我试图在我的df中爆炸列,但我仍然无法修复该问题,即使我知道是什么导致了它。你能看看我的问题吗?非常感谢。