Pandas系列的直方图值

时间:2012-10-29 21:01:02

标签: python pandas numpy matplotlib

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

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

3 个答案:

答案 0 :(得分:68)

您只需使用NumPy的{​​{3}}功能:

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

其中division是自动计算的bin的边框,count是每个bin中的填充。

如果你需要修改一定数量的箱子,你可以使用参数箱子并指定一些箱子,或者直接给它们每个箱子之间的边界。

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

绘制结果你可以使用matplotlib函数hist,但是如果你在pandas中工作,每个Series都有自己的hist函数句柄,你可以给它选择的binning:

series.hist(bins=division)

答案 1 :(得分:16)

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

答案 2 :(得分:4)

如果你想要获得直方图的值,你只需要查看系列中每个唯一值的频率,如果我没有弄错的话。在这种情况下,您只需执行 <form name="myform" id="myform"> <div class="form-group"> <label for="fullName">Name:</label> <input type="text" name="fullName" class="form-control"> </div> <div class="form-group"> <label for="email">Email:</label> <input type="email" name="email" class="form-control"> </div> <div class="form-group"> <label for="subject">Subject:</label> <input type="text" name="subject" class="form-control"> </div> <div class="form-group"> <label for="mark">Mark:</label> <input type="number" name="mark" class="form-control"> </form> <button type="submit" class="btn btn-success " id="submitform">Submit</button> <script> $(document).ready(function () { $("#submitform").click(function (e) { var MyForm = JSON.stringify($("#myform").serializeJSON()); console.log(MyForm); $.ajax( { url: "<your url>", type: "POST", data: MyForm, }); e.preventDefault(); //STOP default action }); }); </script> ,即可获得:

serie.value_counts()