有一种绘制系列直方图的方法,但是有一个函数可以检索直方图计数以在其上进行进一步的计算吗?
我一直在使用numpy的函数来执行此操作,并在需要时将结果转换为DataFrame或Series。一直与熊猫物体呆在一起会很好。
答案 0 :(得分:12)
由于hist
和value_counts
不使用Series'索引,因此您可以将系列视为普通数组并直接使用np.histogram
。然后从结果中构建一个Series。
In [4]: s = Series(randn(100))
In [5]: counts, bins = np.histogram(s)
In [6]: Series(counts, index=bins[:-1])
Out[6]:
-2.968575 1
-2.355032 4
-1.741488 5
-1.127944 26
-0.514401 23
0.099143 23
0.712686 12
1.326230 5
1.939773 0
2.553317 1
dtype: int32
这是一种非常方便的方法来组织直方图的结果以供后续计算。
要按每个bin的 center 而不是左边缘进行索引,可以使用bins[:-1] + np.diff(bins)/2
。
答案 1 :(得分:9)
如果你的系列是离散的,你可以使用value_counts
:
In [11]: s = pd.Series([1, 1, 2, 1, 2, 2, 3])
In [12]: s.value_counts()
Out[12]:
2 3
1 3
3 1
dtype: int64
您可以看到s.hist()
基本上等同于s.value_counts().plot()
。
如果它是浮动的,可怕的hacky解决方案可能是使用groupby:
s.groupby(lambda i: np.floor(2*s[i]) / 2).count()
答案 2 :(得分:2)
如果您知道所需的垃圾箱数量,可以使用pandas'cut
功能,现在可以通过value_counts
访问该功能。使用相同的随机示例:
s = pd.Series(np.random.randn(100))
s.value_counts(bins=5)
Out[55]:
(-0.512, 0.311] 40
(0.311, 1.133] 25
(-1.335, -0.512] 14
(1.133, 1.956] 13
(-2.161, -1.335] 8