获取 pandas 系列中文档频率最高的前 100 个词

Getting top 100 words with highest document frequency in a pandas series

假设我有一个像这样的 pandas 系列:

0  "sun moon earth moon"
1  "sun saturn mercury saturn"
2  "sun earth mars"
3  "sun earth saturn sun saturn"

我想获得最高行 ("document") 频率的前 3 个单词 与单行 ("document") 中的频率无关 .

对于整体频率,我可以只收集字符串中所有行的所有单词,进行拆分,转换回系列并使用 value_counts。在那种情况下,前 3 个频率将是:

1. sun:    5
2. saturn: 4
3. earth:  3

但是文档频率,即单词出现的行数,将是

1. sun:    4
2. earth:  3
3. saturn: 2

我能想到的一种方法是对系列应用 lambda 函数,拆分每个字符串,从中创建一个集合,然后将所有单词组合成一个集合,制作一个系列然后使用 value_counts。有没有更有效的方法来实现同样的事情?

因为性能很重要 Counter:

from collections import Counter

a = Counter([y for x in s for y in x.split()]).most_common(3)
print (a)
[('sun', 5), ('saturn', 4), ('earth', 3)]

b = Counter([y for x in s for y in set(x.split())]).most_common(3)
print (b)
[('sun', 4), ('earth', 3), ('saturn', 2)]

df1 = pd.DataFrame(a, columns=['val','count'])
#df2 = pd.DataFrame(b, columns=['val','count'])
print (df1)
      val  count
0     sun      5
1  saturn      4
2   earth      3

Pandas 备选方案:

a = s.str.split(expand=True).stack().value_counts().head(3)
print (a)
sun       5
saturn    4
earth     3
dtype: int64

b = (s.str.split(expand=True)
      .stack()
      .reset_index(name='val')
      .drop_duplicates(['val', 'level_0'])['val']
      .value_counts()
      .head(3))
print (b)
sun       4
earth     3
saturn    2
Name: val, dtype: int64