gpt4 book ai didi

python - 分组(按)值的 Pandas 直方图(计数)

转载 作者:太空宇宙 更新时间:2023-11-04 05:26:09 31 4
gpt4 key购买 nike

我有一个如下所示的 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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com