21

有一种绘制系列直方图的方法,但是是否有一个函数可以检索直方图计数以在其之上进行进一步计算?

我一直使用 numpy 的函数来执行此操作,并在需要时将结果转换为 DataFrame 或 Series。一直和熊猫对象呆在一起会很好。

4

4 回答 4

16

如果您的系列是离散的,您可以使用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().

如果它是浮动的,一个糟糕的解决方案可能是使用 groupby:

s.groupby(lambda i: np.floor(2*s[i]) / 2).count()
于 2013-06-17T13:38:48.173 回答
14

既然histvalue_counts使用Series的索引,不如把Series当做一个普通的数组np.histogram直接使用。然后根据结果构建一个系列。

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 的中心而不是左边缘进行索引,您可以使用bins[:-1] + np.diff(bins)/2.

于 2013-06-17T15:02:54.617 回答
6

如果你知道你想要的垃圾箱数量,你可以使用 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
于 2016-12-19T11:12:06.687 回答
0

根据相关问题答案,您可以获得 bin 边缘和直方图计数,如下所示:

s = pd.Series(np.random.randn(100))
ax = s.hist()

for rect in dd.patches:
    ((x0, y0), (x1, y1)) = rect.get_bbox().get_points()
    print(((x0, y0), (x1, y1)))
于 2021-11-16T07:52:05.227 回答