我有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中的东西,我不想这样做。
答案 0 :(得分:6)
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
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