根据大量 python 数据帧中的字数删除关键字

如果我有这个df数据框 41,000 行包含数千个单词,例如像这样的df:


column1                                                                   column2

better spotted better rights rights rights fresh fresh rights rights      2015

better rights reserved                                                    2016

better                                                                    2015

better horse                                                              2014

我用这段代码得到了从df到df2的每个单词的频率:


df2 = df['column1'].str.split(expand=True).stack().value_counts()


我的df2看起来像这样:


keywords      counts

spotted        1

better         5

fresh          2

rights         6

horse          1

reserved       1


然后如何删除df中基于df2计数低于 5 次的所有关键字,那么df将如下所示:


column1                                           column2

better better rights rights rights rights rights  2015

better rights                                     2016

better                                            2015

better                                            2014

我最初的尝试是从df2制作关键字列表,如下所示:


ListKeywords = ['spotted', 'fresh', 'horse', 'reserved']

然后使用以下代码从df中删除ListKeywords中的所有单词:


df['column1'] = df['column1'].apply(lambda x: ' '.join([word for word in x.split() if word not in (ListKeywords)]))

然后我很沮丧,因为我有 15,000 个关键字,所有行中的字数都低于 5 次。这意味着我必须将这 15,000 个关键字放入ListKeywords,这太疯狂了。


任何人都可以帮助我摆脱这种沮丧吗?谢谢你


PIPIONE
浏览 102回答 1
1回答

明月笑刀无情

尽管您创建了在 value_counts 之前df2使用 ed 系列更容易。stack这允许您对其进行过滤,然后str.join仅返回您想要保留的单词。s = df['column1'].str.split(expand=True).stack()# Keep only words with frequency above specified thresholdcutoff = 5s = s[s.groupby(s).transform('size') >= cutoff]# Alignment based on original Indexdf['column1'] = s.groupby(level=0).agg(' '.join)                                            column1  column20  better better rights rights rights rights rights     20151                                     better rights     20162                                            better     20153                                            better     2014据您所知,如果使用value_countsDataFrame,您可以对其进行子集化并ListKeywords仅通过指定截止值来生成。但是,我们已经split通过'column1'Series 来获得计数,所以在这里重新计算是相当低效的。df2 = df['column1'].str.split(expand=True).stack().value_counts()cutoff = 5ListKeywords = df2[df2 >= cutoff].index#Index(['rights', 'better'], dtype='object')df['column1'].apply(lambda x: ' '.join([i for i in x.split(' ') if i in ListKeywords]))起始数据df = pd.DataFrame({'column1': ['better spotted better rights rights rights fresh fresh rights rights',                               'better rights reserved', 'better', 'better horse'],                   'column2': [2015, 2016, 2015, 2014]})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python