【问题标题】:How to split continuous data into groups?如何将连续数据分组?
【发布时间】:2015-09-07 15:22:39
【问题描述】:

我有两个数据集,第一个是离散数据,第二个是连续数据:

import numpy as np

# discrete
data1 = [1, 1, 2, 2, 2, 3, 4, 4,7, 7, 7, 7, 7, 7]

# continuous
data2 = np.random.normal(size=100)

现在我想计算频率。 data1 很简单,因为它包含离散值:

import collections
c = collections.Counter(data1)
sum = sum(c.values())
for key,val in c.iteritems():
   print([key,float(val)/sum])

我怎样才能对连续数字做同样的事情?从理论上我知道必须对连续数据进行分组。只有在此之后,它才能表示为条形图。那么,如何在python中对数据进行分组呢?

【问题讨论】:

  • 你是受限于 NumPy,还是可以使用 pandas?
  • @ajcr:这只是一个例子。所以,如果想看看如何使用 pandas 会很高兴
  • 你要value_counts吗?
  • 查看numpy.histogram 获取连续数据。同样,您可以将numpy.bincount 用于离散数据。

标签: python numpy dataframe


【解决方案1】:

对于 numpy,请查看 np.histogram 的连续数据和 np.bincount 的离散数据。

举个简单的例子:

import numpy as np

data1 = [1, 1, 2, 2, 2, 3, 4, 4, 7, 7, 7, 7, 7, 7]
data2 = np.random.normal(size=100)


discrete_counts = np.bincount(data1)
discrete_vals = np.arange(len(discrete_counts))

counts, edges = np.histogram(data2)

如果您想绘制结果,请查看plt.histplt.bar

例如:

import numpy as np
import matplotlib.pyplot as plt

data1 = [1, 1, 2, 2, 2, 3, 4, 4, 7, 7, 7, 7, 7, 7]
data2 = np.random.normal(size=100)

fig, axes = plt.subplots(nrows=2)

counts = np.bincount(data1)
vals = np.arange(len(counts))
axes[0].bar(counts, vals, align='center', color='lightblue')
axes[0].set(title='Discrete Data')

axes[1].hist(data2, color='salmon')
axes[1].set(title='Continuous Data')

for ax in axes:
    ax.margins(0.05)
    ax.set_ylim(bottom=0)

plt.show()

如果您使用pandas,正如@Carsten 所提到的,请查看hist 函数来绘制直方图(类似于plt.hist)。但是,numpy.histogram 的等效项是 pandas.cut,这在您想要直方图计数(或想要按连续范围分组)时非常方便。

【讨论】:

    【解决方案2】:

    您要查找的内容称为histogram。您可以使用numpy.histogram 从您的阵列中获取其中之一。您将一个 numpy 数组和您的组的边缘(或 bins,因为它们通常被称为)传递给函数,它将返回一个 2 元组,由每个 bin 中的元素数组成和垃圾箱边缘。文档中的示例:

    >>> np.histogram([1, 2, 1], bins=[0, 1, 2, 3])
    (array([0, 2, 1]), array([0, 1, 2, 3]))
    

    @ajrc 在 cmets 中提到了 pandas。如果你有一个熊猫Series(你可以用s = pandas.series(data2)创建一个,你可以通过调用s.hist()创建一个直方图。它将在你的数据范围内创建一个具有等间距bin的直方图(默认bin 数量为 10,但您可以使用 bins 参数进行调整。

    【讨论】:

      猜你喜欢
      • 2018-10-20
      • 2021-09-17
      • 2017-01-13
      • 2018-09-30
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2012-05-16
      相关资源
      最近更新 更多