77

我在 Python Pandas 系列中有一些值(类型pandas.core.series.Series:)

In [1]: series = pd.Series([0.0,950.0,-70.0,812.0,0.0,-90.0,0.0,0.0,-90.0,0.0,-64.0,208.0,0.0,-90.0,0.0,-80.0,0.0,0.0,-80.0,-48.0,840.0,-100.0,190.0,130.0,-100.0,-100.0,0.0,-50.0,0.0,-100.0,-100.0,0.0,-90.0,0.0,-90.0,-90.0,63.0,-90.0,0.0,0.0,-90.0,-80.0,0.0,])

In [2]: series.min()
Out[2]: -100.0

In [3]: series.max()
Out[3]: 950.0

我想获取直方图的值(不需要绘制直方图)...我只需要获取每个间隔的频率。

假设我的间隔从 [-200; -150] 至 [950;1000]

所以下界是

lwb = range(-200,1000,50)

和上限是

upb = range(-150,1050,50)

我现在不知道如何获取频率(每个间隔内的值的数量)......我确信定义 lwb 和 upb 是没有必要的......但我不知道我应该使用什么函数执行此操作!(在 Pandas doc 中潜水后,我认为cut函数可以帮助我,因为它是一个离散化问题......但我不明白如何使用它)

在能够做到这一点之后,我将看看显示直方图的方式(但这是另一个问题)

4

3 回答 3

100

您只需要使用的直方图函数NumPy

import numpy as np
count, division = np.histogram(series)

其中除法是自动计算的垃圾箱边界,计数是每个垃圾箱内的人口。

如果需要固定一定数量的 bins,可以使用参数 bins 并指定 bins 的数量,或者直接给它每个 bin 之间的边界。

count, division = np.histogram(series, bins = [-201,-149,949,1001])

要绘制结果,您可以使用 matplotlib 函数 hist,但如果您在 pandas 中工作,每个系列都有自己的 hist 函数句柄,您可以给它选择的分箱:

series.hist(bins=division)

编辑:正如另一张海报所提到的,Pandas它是建立在NumPy. 由于 OP 明确使用Pandas,我们可以通过访问来取消额外的NumPy导入Pandas

count, division = pd.np.histogram(series)
于 2012-10-29T22:07:25.197 回答
21

为了获得给定区间分箱范围内的值的频率计数,我们可以利用pd.cutwhich 返回每个元素的半开箱的索引以及value_counts计算它们各自的计数。

为了绘制它们的计数,可以制作条形图。

step = 50
bin_range = np.arange(-200, 1000+step, step)
out, bins  = pd.cut(s, bins=bin_range, include_lowest=True, right=False, retbins=True)
out.value_counts().plot.bar()

在此处输入图像描述

每个间隔的频率按其计数的降序排序:

out.value_counts().head()
[-100, -50)    18
[0, 50)        16
[800, 850)      2
[-50, 0)        2
[950, 1000)     1
dtype: int64

要修改绘图以仅包含范围的较低闭合区间以达到审美目的,您可以执行以下操作:

out.cat.categories = bins[:-1]
out.value_counts().plot.bar()

在此处输入图像描述

于 2016-12-18T16:35:04.333 回答
2

如果您说要获取直方图的值,那么您只是在寻找系列中每个唯一值的频率,如果我没记错的话。在这种情况下,你可以简单地做serie.value_counts(),这会给你:

 0.0      16
-90.0      8
-100.0     5
-80.0      3
 63.0      1
-50.0      1
 130.0     1
 190.0     1
 840.0     1
-48.0      1
 208.0     1
-64.0      1
 812.0     1
-70.0      1
 950.0     1
于 2016-11-25T04:48:23.500 回答