在Python中对频率分布进行分组

7
我有两个列表 value freq ,数据如下:

value freq
1      2
2      1
3      3
6      2
7      3
8      3
....

我希望输出结果如下:

bin freq
1-3   6
4-6   2
7-9   6
...

我可以编写几行代码来完成此操作。但是,我想知道是否有标准Python或Numpy内置函数可以使用?当您获得具有重复的数组/列表数据时,即它们尚未分组为频率表(例如 d= [1,1,2,3,3,3,6,6,7,7,7,8,8,8,...])时,我找到了解决方案。但在这种情况下,我找不到答案。我不想先将我的数据转换为单个扩展列表,例如d,然后再使用直方图函数。

3个回答

15
import numpy as np
values = [1,2,3,6,7,8]
freqs = [2,1,3,2,3,3]

hist, _ = np.histogram(values, bins=[1, 4, 7, 10], weights=freqs)
print hist

输出:

[6 2 6]

0

你可以尝试这个:

import collections
d=[1,1,2,3,3,3,6,6,7,7,7,8,8,8]
collections.Counter([i-i%3+3 for i in d])

它将生成一个包含您想要的内容的字典。


我的数据不是以你所取的方式提供,而是作为两个不同的值和频率列表。如果以这种方式给出,np.histogram 就可以工作了。 - DurgaDatta

0
当你得到一个有重复的数组/列表时,我找到了解决方案。
虽然你没有说出这个解决方案是什么,但如果它支持使用迭代器,你可以生成它,而不是创建整个列表:
import itertools
values = [1,2,3,6]
freqs =  [2,1,3,2]

v_iter = itertools.chain(*[ itertools.repeat(v,f) for v, f in zip(values, freqs) ])

#for x in v_iter:
#    print x

your_solution(v_iter)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接