从 csv DataFrame 行中删除 nltk 停用词

Removing nltk stopwords from csv DataFrame rows

我正在尝试从从 .csv 读取的以下 DataFrame 中删除停用词。它基本上是一长串二元组及其在洗发水标签数据集中出现的频率。

目标是在 'word1' 或 'word2' 列中出现停用词时删除整行。

                        word1                      word2  frequency
0                       nicht                         in       3069
1                        wenn                        sie       2729
2                         von                    kindern       2108
3                         die                      hände       2094
4                        darf                      nicht       2091
5                       hände                        von       2091
6                      citric                       acid       2088
7                     kindern                   gelangen       2082
8                         sie                      einen       2053
9                         mit                        den       2023
10                       eine                   reaktion       1976

然而,到目前为止,当它与来自 nltk 的德语停用词匹配时,我什至无法删除仅基于列 'word1' 的行。

我使用的代码基于之前回答的问题

import pandas as pd
from nltk.corpus import stopwords

stop = stopwords.words('german')

df = pd.read_table("myfile.csv", sep=";")
df.columns = ["word1","word2","frequency"]

df["word1"] = df["word1"].apply(lambda x: ' '.join([word for word in x.split() if word not in (stop)]))

print(df) 

我得到的错误是: AttributeError: 'list' object 没有属性 'split'

我完全理解我不理解被调用函数的错误。我在边上课边尝试加深对 pandas 和 nltk 的理解,但这并没有什么实际意义 :)

清除 DataFrame 中的停用词后,目标是将其写入新的 CSV 文件中。不过那是后话了。

编辑:为澄清起见更改标题

apply-函数不会删除任何行。它只是将一个函数映射到 Series df["word1"] 的每个元素上。此外,您在 "word1" 列中的条目似乎是 list 类型而不是 string.

但是,如果 df 是一个 pandas DataFrame,其中包含一列 "word1",其中包含字符串,就这样做

df = df[~df["word1"].isin(stop)]

... 并且您从 df 中删除所有条目,其中 "word1" 处于停止状态。这里~是否定运算符,所以表示不是some_series.isin(some_iterable) 方法 returns 具有与 some_series[=43= 相同索引的系列],其中每个条目都是一个布尔值,表示 some_series 中的相应条目是否包含在 some_iterable.[= 中13=]

通常,您可以使用

从 DataFrame select 切片
df[Series of booleans]

其中 "Series" 表示 pandas 系列。由于 pandas 系列与比较运算符一起工作,您可以执行

df[df["frequency"] > 2060]

其中 returns 一个仅包含频率值高于 2060 的行的 DataFrame。

编辑:我不确定否决票是否来自您,但如果此处提供的代码不起作用,您应该显示几行 .csv 文件,因为来自您的仅凭代码我们无法知道您的 DataFrame 到底是什么样子。

干杯, 西拉斯

您可以为此目的使用列表理解。在这里,创建了一个新列 temptemp 的值是 False 如果 word1word2stop。删除那些 temp 值为 False 的行。最后,删除 temp 列并写入新的 csv 文件。希望这有帮助。

import pandas as pd
from nltk.corpus import stopwords

stop = stopwords.words('english')
df = pd.read_csv("myfile.csv", sep=";")


df["temp"] = [True  if row.word1 not in stop and row.word2 not in stop else False for index, row in df.iterrows()]
df = df[df.temp == True]
df.drop('temp', axis=1, inplace=True)

df.to_csv("myfile_out.csv", sep=';')