从CSV DataFrame行中删除NLTK停用词

时间:2018-06-20 22:01:52

标签: python pandas csv nltk corpus

我正在尝试从以下从.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。但这是在以后的阶段。

编辑:标题更改以供澄清

2 个答案:

答案 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到底是什么样子。

干杯, 西拉斯