我有一个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列进行分组,并在10个新列中获取列value的直方图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


其中1列是第一个bin(0.00.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

关于python - Pandas 直方图(计数)的分组(按)值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38606912/

10-14 02:32