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

时间:2016-06-04 17:51:43

标签: python numpy pandas

我有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,但所有列的长度必须相同。基于行的简单求和也不起作用,因为同一产品可能位于每列的不同行上。

有没有人知道最好的方法是什么?我知道我可以做简单的暴力循环,但如果我可以使用numpy或pandas中的东西,我不想这样做。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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个样本,产品编号从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:]

然后它只使用%timeit

在IPython中运行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