分组(by)值的熊猫直方图(计数)

时间:2016-07-27 07:48:44

标签: python pandas aggregate histogram

我有一个Report,如下所示:

DataFrame

我想在>>> df type value 0 1 0.698791 1 3 0.228529 2 3 0.560907 3 1 0.982690 4 1 0.997881 5 1 0.301664 6 1 0.877495 7 2 0.561545 8 1 0.167920 9 1 0.928918 10 2 0.212339 11 2 0.092313 12 4 0.039266 13 2 0.998929 14 4 0.476712 15 4 0.631202 16 1 0.918277 17 3 0.509352 18 1 0.769203 19 3 0.994378 列上进行分组,并在10个新列中获取列type的直方图分档,例如类似的东西:

value

1 3 9 6 8 10 5 4 7 2 type 1 0 1 0 0 0 2 1 1 0 1 2 2 1 1 0 0 1 1 0 0 0 3 2 0 0 0 0 1 1 0 0 0 4 1 1 0 0 0 1 0 0 0 1 是第一个bin(10.0)的计数,依此类推......

使用0.1,我只能获得以下内容:

numpy.histogram

之后我无法设置正确的格式(至少不是以简单的方式)。

我找到了一个可以做我想要的技巧,但它非常难看:

>>> df.groupby('type')['value'].agg(lambda x: numpy.histogram(x, bins=10, range=(0, 1)))
    type
1       ([0, 1, 1, 1, 1, 0, 0, 0, 0, 2], [0.0, 0.1, 0....
2       ([2, 0, 1, 0, 1, 0, 0, 0, 1, 1], [0.0, 0.1, 0....
3       ([2, 0, 0, 0, 1, 0, 0, 0, 0, 1], [0.0, 0.1, 0....
4       ([1, 1, 1, 0, 0, 0, 0, 0, 0, 1], [0.0, 0.1, 0....
Name: value, dtype: object

有没有更好的方法来做我想要的?我知道在>>> d = {str(k): lambda x, _k = k: ((x >= (_k - 1)/10) & (x < _k/10)).sum() for k in range(1, 11)} >>> df.groupby('type')['value'].agg(d) 1 3 9 6 8 10 5 4 7 2 type 1 0 1 0 0 0 2 1 1 0 1 2 2 1 1 0 0 1 1 0 0 0 3 2 0 0 0 0 1 1 0 0 0 4 1 1 0 0 0 1 0 0 0 1 中,R方法可以返回aggregate,但不能返回python ...

1 个答案:

答案 0 :(得分:1)

是你想要的吗?

In [98]: %paste
bins = np.linspace(0, 1.0, 11)
labels = list(range(1,11))

(df.assign(q=pd.cut(df.value, bins=bins, labels=labels, right=False))
   .pivot_table(index='type', columns='q', aggfunc='size', fill_value=0)
)
## -- End pasted text --
Out[98]:
q     1   2   3   4   5   6   7   8   9   10
type
1      0   1   0   1   0   0   1   1   1   4
2      1   0   1   0   0   1   0   0   0   1
3      0   0   1   0   0   2   0   0   0   1
4      1   0   0   0   1   0   1   0   0   0