在python中查找数字列表的频率分布

Posted

技术标签:

【中文标题】在python中查找数字列表的频率分布【英文标题】:Finding frequency distribution of a list of numbers in python 【发布时间】:2017-03-26 00:00:01 【问题描述】:

我有一长串数字,如下所示。我想找到每个数字的频率分布,但我无法使用 Counter 函数来获取每个项目的频率,因为它们是整数并且我得到它不可迭代的错误,因此我无法将列表转换为字符串.我检查了类似的问题,但它们对我不起作用。

data=[1.0, 2.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 15.0, 0.0, 0.0, 0.0, 0.0, 3.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 7.0, 1.0, 0.0, 0.0, 4.0, 3.0, 3.0, 1.0, 1.0, 2.0, 4.0, 0.0, 1.0, 7.0, 2.0, 1.0, 1.0, 4.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 2.0, 3.0, 2.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0, 0.0, 10.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 2.0, 3.0, 0.0, 3.0, 2.0, 11.0, 0.0, 5.0, 2.0, 0.0, 1.0, 2.0, 1.0, 8.0, 1.0, 0.0, 6.0, 2.0, 4.0, 0.0, 17.0, 0.0, 27.0, 2.0, 2.0, 1.0, 1.0, 3.0, 2.0, 0.0, 0.0, 6.0, 0.0, 0.0, 1.0, 1.0, 2.0, 0.0, 10.0, 0.0, 0.0, 5.0, 7.0, 1.0, 0.0, 1.0, 2.0, 1.0, 5.0, 2.0, 1.0, 9.0, 1.0, 0.0, 2.0, 0.0, 1.0, 3.0, 1.0, 1.0, 0.0, 0.0, 3.0, 5.0, 2.0, 0.0, 1.0, 9.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 3.0, 1.0, 0.0, 0.0, 0.0, 1.0, 1.0, 2.0, 0.0, 1.0, 1.0, 3.0, 1.0, 2.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 5.0, 2.0, 3.0, 2.0, 8.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 1.0, 1.0, 1.0, 1.0, 4.0, 1.0, 0.0, 2.0, 1.0, 1.0, 19.0, 0.0, 1.0, 0.0, 1.0, 2.0, 1.0, 2.0, 1.0, 1.0, 5.0, 4.0, 2.0, 0.0, 1.0, 2.0, 0.0, 5.0, 0.0, 0.0, 3.0, 1.0, 0.0, 1.0, 1.0, 0.0, 3.0, 2.0, 4.0, 10.0, 2.0, 1.0, 3.0, 1.0, 0.0, 2.0, 1.0, 1.0, 1.0, 1.0, 0.0, 2.0, 17.0, 0.0, 2.0, 3.0, 2.0, 1.0, 0.0, 2.0, 2.0, 1.0, 2.0, 5.0, 2.0, 1.0, 1.0, 1.0, 3.0, 0.0, 1.0, 1.0, 0.0, 4.0, 5.0, 2.0, 2.0, 1.0, 3.0, 0.0, 1.0, 3.0, 1.0, 1.0, 1.0, 0.0, 3.0, 2.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 3.0, 5.0, 0.0, 1.0, 4.0, 0.0, 0.0, 1.0, 6.09]

【问题讨论】:

【参考方案1】:

你可以使用一些简单的东西,比如:

def freq(lst):
    d = 
    for i in lst:
        if d.get(i):
            d[i] += 1
        else:
            d[i] = 1
    return d

结果:

>>> freq(data)
0.0: 72, 1.0: 106, 2.0: 40, 3.0: 21, 4.0: 9, 5.0: 10, 6.0: 2, 7.0: 3, 8.0: 2, 9.0: 2, 10.0: 3, 11.0: 1, 15.0: 1, 17.0: 2, 19.0: 1, 6.09: 1, 27.0: 1

虽然Counter 对我来说很好用(我复制粘贴了你发布的data):

...
>>> from collections import Counter
>>> Counter(data)
Counter(1.0: 106, 0.0: 72, 2.0: 40, 3.0: 21, 5.0: 10, 4.0: 9, 7.0: 3, 10.0: 3, 6.0: 2, 8.0: 2, 9.0: 2, 17.0: 2, 11.0: 1, 15.0: 1, 19.0: 1, 6.09: 1, 27.0: 1)

【讨论】:

非常感谢,我修改了我的数据,您的两个解决方案现在都可以使用 "if d.get(i)" 检查什么?什么是“”? @AllDani.com, "if d.get(i)" 检查i 是否是字典中的现有键,对于,在python 字典中使用@ 987654328@符号。 啊哈。所以所有我不应该知道的东西,考虑到我在 Udacity 课程中的位置:D。谢谢!【参考方案2】:

distribution =i:data.count(i)/len(data) for i in set(data)

【讨论】:

以上是关于在python中查找数字列表的频率分布的主要内容,如果未能解决你的问题,请参考以下文章

使用 .Net/C# 计算集合的频率分布

Python 频率分布 (FreqDist / NLTK) 问题

如何将列表中的值分配给熊猫数据框并控制每个列表元素在数据框中的分布/频率

频率分布比较 Python

在 Python 中创建频率分布表

Python Plotly CDF 与频率分布数据