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

Python 计算不同长度向量中元素出现的总数,python,numpy,pandas,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 'prod

我有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
产品在vector中可能以任何顺序排列,在vector中,每个产品只出现一次

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

有人知道什么是最好的方法吗?我知道我可以做简单的蛮力循环,但我不想知道我是否可以使用numpy或pandas的产品。

您可以使用以下几行代码来实现这一点:

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

只需使用Python内置函数
count

(v1+v2+v3).count('product1')
Out[4]: 3
如果要构建一个
目录

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。一个男孩把他们分成三块

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
,使用
集合。计数器

%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
使用内置的
计数

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

如果某个向量中没有重复项,
pd.value\u计数(v1+v2+v3)
应该可以做到。@ayhan你是对的,它也在工作。非常感谢。