不同长度向量中元素出现次数的总计算

3

我有三个非常长(100K+元素)的产品名称向量。每个向量的长度都不同。我的目标是计算每个产品在多少个向量中出现。就像这样:

v1 = ['product1','product2','product3']
v2 = ['product3','product1','product5','product7','product10']
v3 = ['product1','product10']

'product1' 3
'product2' 1
'product3' 2
'product5' 1
'product7' 1
'product10' 2

向量中的产品可以以任何顺序出现,而且在每个向量中,每个产品只出现一次。

我想在这里使用 pandas 的 DataFrame,但是所有列必须具有相同的长度。此外,基于行的简单求和将不起作用,因为同一产品可能在每个列中的不同行上出现。

有人有什么好的方法来解决这个问题吗?我知道我可以使用简单的 bruteforce 循环,但如果我可以使用 numpy 或 pandas 中的某些东西,我就不想使用循环。


3
如果在某个向量中没有重复项,则pd.value_counts(v1 + v2 + v3)可以完成此操作。 - ayhan
@ayhan 你是对的,它也能正常工作。谢谢! - sebap123
2个回答

6

您可以使用 Counterchain 在几行代码中实现此功能:

from collections import Counter
from itertools import chain

v1 = ['product1','product2','product3']
v2 = ['product3','product1','product5','product7','product10']
v3 = ['product1','product10']

c = Counter(chain(v1, v2, v3))
# more space-efficient than Counter(v1 + v2 + v3)
# Counter({'product1': 3, 'product10': 2, 'product3': 2, 'product7': 1, 'product5': 1, 'product2': 1})

c['product10']
# 2

0

只需使用Python内置函数count

(v1+v2+v3).count('product1')
Out[4]: 3

如果你想要建立一个 dict
v=v1+v2+v3
dict((x,v.count(x)) for x in v)
Out[17]: 
{'product1': 3,
 'product10': 2,
 'product2': 1,
 'product3': 2,
 'product5': 1,
 'product7': 1}

只是出于好奇,我生成了5000个样本,产品ID从0到100。然后将它们分成了3份。
import numpy as np
v = ['product' + str(x) for x in np.random.randint(0, 100, 5000)]
v1 = v[0:100]
v2 = v[100:4000]
v3 = v[4000:]

然后在IPython中运行一个`%timeit`,使用`collections.Counter`:
%timeit from collections import Counter
from itertools import chain
c = Counter(chain(v1, v2, v3))
c['product10']

The slowest run took 5.87 times longer than the fastest. This could mean that an intermediate result is being cached 
1000000 loops, best of 3: 875 ns per loop
Out[30]: 47

使用内置的count

%timeit (v1+v2+v3).count('product10')
10000 loops, best of 3: 58.1 µs per loop
Out[31]: 47

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接