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
,我们可以通过访问NumPy
到Pandas
来取消额外的导入:
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 系列的直方图值的主要内容,如果未能解决你的问题,请参考以下文章