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

霍尔特

我有一个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

我想对type进行分组,value在10个新列中获得列的直方图bin ,例如:

      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

其中column1是第一个bin(0.0to 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方法可以返回DataFrame,但在python中却不能。

最大容量

那是你要的吗?

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章