从 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 到底是什么样子。
干杯,
西拉斯
您可以为此目的使用列表理解。在这里,创建了一个新列 temp。 temp 的值是 False 如果 word1 或 word2 在 stop。删除那些 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=';')
我正在尝试从从 .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=]
通常,您可以使用 其中 "Series" 表示 pandas 系列。由于 pandas 系列与比较运算符一起工作,您可以执行 其中 returns 一个仅包含频率值高于 2060 的行的 DataFrame。 编辑:我不确定否决票是否来自您,但如果此处提供的代码不起作用,您应该显示几行 .csv 文件,因为来自您的仅凭代码我们无法知道您的 DataFrame 到底是什么样子。 干杯,
西拉斯df[Series of booleans]
df[df["frequency"] > 2060]
您可以为此目的使用列表理解。在这里,创建了一个新列 temp。 temp 的值是 False 如果 word1 或 word2 在 stop。删除那些 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=';')