假设我有一个这样的熊猫系列:
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