Pandas系列的柱状图值

2024-04-30 07:09:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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函数可以帮助我,因为它是一个离散化问题。。。但我不知道怎么用)

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


Tags: 函数incore类型pandas间隔range直方图
3条回答

为了得到给定间隔binned范围内的值的频率计数,我们可以使用^{}来返回每个元素的半打开的bin的索引以及^{}来计算它们各自的计数。

要绘制计数,可以绘制条形图。

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(sort=False).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(sort=False).plot.bar()

enter image description here

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

您只需要使用NumPyhistogram函数:

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

其中division是自动计算的箱子边界,count是每个箱子内的人口。

如果需要修复一定数量的bin,可以使用参数bins并指定若干个bin,或者直接为其指定每个bin之间的边界。

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

要绘制结果,可以使用matplotlib函数hist,但如果在pandas中工作,则每个系列都有自己的hist函数句柄,并且可以为其指定选定的binning:

series.hist(bins=division)

编辑: 正如另一张海报所提到的,Pandas是建立在NumPy之上的。由于OP显式地使用Pandas,我们可以通过Pandas访问NumPy来消除额外的导入:

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

相关问题 更多 >