Pandas系列的直方图值

85
我有一些值在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文档后,我认为cut函数可以帮我解决这个问题,因为这是一个离散化的问题...但我不知道如何使用它)

在学会了这个之后,我将研究如何显示直方图(但那是另一个问题)


“series”的单数形式仍然是“series”:http://ell.stackexchange.com/questions/23268/is-series-plural-or-singular - kd88
3个回答

115

你只需要使用NumPyhistogram函数:

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

division 是为你的箱子自动计算的边界,count 是每个箱子内的人口数量。

如果您需要固定数量的箱子,可以使用参数 bins 并指定箱子数量,或直接给出每个箱子之间的边界。

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

要绘制结果,您可以使用matplotlib函数hist,但如果您正在使用pandas,则每个Series都有其自己的处理程序来处理hist函数,并且您可以为其提供所选择的binning:

要绘制结果,您可以使用Matplotlib函数hist。但是,如果您在使用Pandas,每个Series都有其自己的hist函数,您可以使用所选的binning。

series.hist(bins=division)

编辑: 正如另一位帖子中提到的那样,Pandas是建立在NumPy之上的。由于OP明确地使用了Pandas,因此我们可以通过Pandas访问NumPy,从而避免额外的导入:

count, division = pd.np.histogram(series)

@FemtoTrader - Pandas是建立在numpy之上的!!! https://dev59.com/Hmgu5IYBdhLWcg3wy558 :-) - Scott Skiles
10
请注意,pd.np 已被弃用,请直接导入 numpy :) - H. Sánchez

25
为了获得给定区间分组范围内值的频率计数,我们可以利用 pd.cut 方法,它返回每个元素的半开箱索引以及 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()

enter image description here

每个区间的频率按其计数值降序排列:

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()

在此输入图片描述


4

如果你说你想获得直方图的值,那么你只是在寻找系列中每个唯一值的频率,如果我没有理解错误。在这种情况下,你可以简单地执行 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

3
接近了-但是直方图正在寻找每个箱中的频率,该箱可能包含多个唯一值。例如,-50和-48可能在同一个箱中。 OP的问题指定他的直方图具有50的间隔的箱。 - DataSwede

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