我正在尝试从以下从.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”列的行。
我使用的代码基于先前回答here的问题。
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”对象没有属性“ split”
我完全理解我在这里因为不了解所调用的函数而有错。在一边学习课程的同时,我正在尝试加深对pandas&nltk的理解,但这并没有真正的意义:)
一旦清除了DataFrame的停用词,目标就是将其写入新的CSV。但这是在以后的阶段。
编辑:标题更改以供澄清
答案 0 :(得分:0)
您可以为此使用列表理解。在这里,创建了一个新列 temp 。如果 word1 或 word2 中的任何一个位于 stop 中,则 temp 的值为 False 。 。删除 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=';')
答案 1 :(得分:-1)
应用功能不会删除任何行。它只是将一个函数映射到Series df [“ word1”] 的每个元素上。另外,您在“ word1” 列中的输入似乎是 list 类型,而不是 string 类型。
但是,如果 df 是一个熊猫数据框,其中包含带有字符串的“ word1” 列,只需执行
df = df[~df["word1"].isin(stop)]
...,然后从df中删除所有条目,其中“ word1”处于停止位置。这里〜是取反运算符,因此它表示不是。 some_series.isin(some_iterable)方法返回具有与 some_series 相同索引的Series,其中每个条目都是一个布尔值,表示是否在 some_series 包含在 some_iterable 中。
通常,您可以使用以下方式从DataFrame中选择切片:
df[Series of booleans]
其中“系列”是指熊猫系列。由于pandas Series与比较运算符合作,因此您可以做类似的事情
df[df["frequency"] > 2060]
返回一个DataFrame,该DataFrame仅包含频率值大于2060的行。
编辑:我不确定下载是否来自您,但是如果此处提供的代码不起作用,则应显示.csv文件的几行内容,因为仅从代码中我们就可以不知道您的DataFrame到底是什么样子。
干杯, 西拉斯