在熊猫系列中获得文档频率最高的前 100 个单词



假设我有一个这样的熊猫系列:

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

我想获得行("文档"(频率最高的前 3 个单词,而不管单行("文档"(内的频率如何。

对于整体频率,我可以从字符串中的所有行中收集所有单词,进行拆分,转换回系列并使用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

熊猫替代品:

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

最新更新