如果我有这个包含 41,000 行的 df 数据框包含数千个单词,例如像这样的 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 看起来像这样:
关键字计数
发现 1
更好 5
新鲜 2
权利 6
马 1
保留 1
然后如何根据df2去除df中计数低于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,这太疯狂了。
谁能帮我摆脱这种挫败感?谢谢
最佳答案
尽管您创建了 df2
,但在 value_counts 之前使用 stack
ed 系列会更容易。这允许您过滤它,然后 str.join
只返回您想要保留的词。
s = df['column1'].str.split(expand=True).stack()
# Keep only words with frequency above specified threshold
cutoff = 5
s = s[s.groupby(s).transform('size') >= cutoff]
# Alignment based on original Index
df['column1'] = s.groupby(level=0).agg(' '.join)
column1 column2
0 better better rights rights rights rights rights 2015
1 better rights 2016
2 better 2015
3 better 2014
就您自己的知识而言,如果使用 value_counts
DataFrame,您可以对其进行子集化并通过仅指定截止值来生成 ListKeywords
。但是,我们已经拆分
'column1'
系列以获取计数,因此在此处重新进行此计算效率相当低。
df2 = df['column1'].str.split(expand=True).stack().value_counts()
cutoff = 5
ListKeywords = 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]})
关于python - 根据大量 python 数据框的字数删除关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59845910/