Pandas 系列的直方图值

Posted

技术标签:

【中文标题】Pandas 系列的直方图值【英文标题】:Histogram values of a Pandas Series 【发布时间】:2012-10-19 05:44:20 【问题描述】:

我在 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 函数可以帮助我,因为这是一个离散化问题......但我不明白如何使用它)

能做到这一点后,我再看看直方图的显示方式(不过那是另外一个问题了)

【问题讨论】:

“系列”的单数是“系列”:ell.stackexchange.com/questions/23268/… 【参考方案1】:

你只需要使用NumPy的histogram函数即可:

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,我们可以通过访问NumPyPandas 来取消额外的导入:

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

【讨论】:

@FemtoTrader - Pandas 建立在 numpy 之上!!! ***.com/questions/11077023/… :-) 请注意,pd.np 已弃用。请直接导入numpy :)【参考方案2】:

为了获得给定区间分箱范围内的值的频率计数,我们可以使用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()

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

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

【讨论】:

【参考方案3】:

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

【讨论】:

关闭 - 但直方图正在寻找每个 bin 中的频率,其中可能包含多个唯一值。例如,-50 和 -48 可能在同一个 bin 中。 OP 的问题指定他的直方图有间隔为 50 的 bin。

以上是关于Pandas 系列的直方图值的主要内容,如果未能解决你的问题,请参考以下文章

Numpy 和 Pandas:从熊猫直方图返回直方图值?

在 Pandas 中绘制带有非常重尾数据的直方图

pandas进行数据预处理

使用 Pandas 的日期时间每小时直方图 [重复]

Python & Pandas:当 Pandas 将直方图绘制到特定轴时的奇怪行为

Pandas 直方图标签和标题