使用用户提供的列表从pandas df中删除停用词

时间:2018-01-24 23:17:48

标签: python pandas dataframe apply stop-words

我有一个raw_corpus,我正在尝试使用用户定义的停止列表删除停用词(我编辑了nltk英语停用词文件)。我的停用词文件肯定有问题吗?

这里是输入pandas df raw_corpus:

raw_corpus

这是我的代码:

#my own custom stopwords list
stoplist="/User/dlhoffman/nltk_data/corpora/stopwords/english"
#filter out stopwords
raw_corpus['constructed_recipe'] = raw_corpus['constructed_recipe'].apply(lambda x: [item for item in x if 
item not in stoplist])
#running the code below verifies empty dataframe
#raw_corpus['constructed_recipe'] = raw_corpus['constructed_recipe'].apply(lambda x: [])

这是结果 - 显然不是我想要的!什么错了?:

output

1 个答案:

答案 0 :(得分:1)

带有生成器表达式的

pd.Series.apply应该可以工作:

import pandas as pd
import re

df = pd.DataFrame([['this is the first test string'],
                   ['this is yet another test'],
                   ['this is a third test item'],
                   ['this is the final test string']],
                  columns=['String'])

replace_set = {'this', 'is'}

df['String'] = df['String'].str.split(' ').apply(lambda x: ' '.join(k for k in x if k not in replace_set))

# df
#                     String
# 0    the first test string
# 1         yet another test
# 2        a third test item
# 3    the final test string

<强>解释

  • pd.Series.str.split按空格分割单词,返回一系列列表,每个列表项都有一个单词。
  • pd.Series.apply接受一个lambda(匿名)函数作为输入,有效地将一个函数应用于循环中系列中的每个项目。
  • 生成器表达式(k for k in x if k not in replace_set)k的每个值作为if条件的可迭代主题返回。
  • ' '.join用于生成器表达式,以根据生成的单词形成字符串。