如何将连续数据拆分成组?

Kla*_*sos 3 python numpy dataframe

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

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)
Run Code Online (Sandbox Code Playgroud)

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

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

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

Joe*_*ton 6

对于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)
Run Code Online (Sandbox Code Playgroud)

如果您想绘制结果,请查看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()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如果您正在使用pandas,正如@Carsten所提到的,请查看hist绘制直方图的函数(类似于plt.hist).然而,相当于numpy.histogrampandas.cut,当你想直方图计数(或连续范围要组),这是非常方便的.


Car*_*ten 5

您正在寻找的是一个直方图.您可以使用numpy.histogram从阵列中获取其中一个.你传递一个numpy数组和你的组(或箱子)的边缘通常称为它们的)传递给函数,它将返回一个2元组,由每个bin中的元素数和bin边缘组成.来自文档的示例:

>>> np.histogram([1, 2, 1], bins=[0, 1, 2, 3])
(array([0, 2, 1]), array([0, 1, 2, 3]))
Run Code Online (Sandbox Code Playgroud)

@ajrc在评论中提到了熊猫.如果你有一只熊猫Series(你可以创建一个pandas s = pandas.series(data2),你可以通过调用创建一个直方图s.hist().它将创建一个直方图,在你的数据范围内具有等间隔的二进制数(默认的二进制数是10,但你可以通过使用bins参数调整).