在python中计算频率的最简洁方法是什么?

时间:2013-11-18 19:06:47

标签: python counting

我的数据如下[0.1,0.2,1,5,100]等等...... 我想做的是计算

之间的项目数
1-10
11-20
21-30
... and so on...

现在,我的代码非常混乱..

我所做的是映射

1-10 :=> 0
11-20:=> 1
..and on..

所以我定义了桶0,其中桶0的范围是1-10,桶1的范围是11-20,依此类推。

代码是:

for ele in data:
    bucket_id = get_bucket_id(ele)
    freq_dict[bucket_id] +=1

get_bucket_id是一个很大的if else代码..

有更好的方法吗?

4 个答案:

答案 0 :(得分:7)

使用Counter并使用整数除法计算存储桶。

from collections import Counter

freq = Counter()
for x in data:
    freq[(x - 1) // 10] += 1

请注意,这会将小于1的值映射到-1。在处理非严格正数据时,您实际上想要使用范围1-9,10-19等

答案 1 :(得分:4)

您可以使用numpy.histogram,其中列出了数据中的元素出现在一组间隔(bins)中的频率。它返回每个bin中的计数和每个bin的最右边:

>>> import numpy as np
>>> data = [0.1,0.2,1,5,100]
>>> hist, bin_edges = np.histogram( data )
>>> hist
array([4, 0, 0, 0, 0, 0, 0, 0, 0, 1])
>>> bin_edges
array([   0.1 ,   10.09,   20.08,   30.07,   40.06,   50.05,   60.04,
         70.03,   80.02,   90.01,  100.  ])

答案 2 :(得分:1)

您可以使用lenfilter

c = []
for l, u in [(1, 10), (11, 20), (21, 30)]: # ...
    c.append(len(filter(lambda x: l <= x <= u, values)))

答案 3 :(得分:1)

您可以在此处使用collections.Counterbisect模块:

>>> from bisect import bisect_left
>>> lis = range(0, 101, 10)
>>> l = [0.1, 0.2, 1, 5, 100, 11]
>>> c = Counter(bisect_left(lis, item) for item in l)
>>> c
Counter({1: 4, 10: 1, 2: 1})
>>> [c[i] for i in xrange(1, 11)]
[4, 1, 0, 0, 0, 0, 0, 0, 0, 1]