【问题标题】:Counting total number of element occurrences in different length vectors计算不同长度向量中元素出现的总数
【发布时间】:2016-06-04 17:51:43
【问题描述】:

我有 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 的东西,我不想这样做。

【问题讨论】:

  • 如果某个向量中没有重复项pd.value_counts(v1 + v2 + v3)应该这样做。
  • @ayhan 你是对的,它也有效。谢谢!

标签: python numpy pandas


【解决方案1】:

您可以使用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

【讨论】:

    【解决方案2】:

    只需使用 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
    

    【讨论】:

      猜你喜欢
      • 2019-06-02
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多