如何按 ID 分组并获取每个类别的计数

我又来了。

我有一个这样的 df

    id  c1  c2  c3
0   0   11  12  0
1   0   15  15  1
2   0   4   24  2
3   0   5   13  2
4   0   3   15  1
5   0   5   7   0
6   0   3   18  2
7   0   17  9   3
8   0   0   17  1
9   0   12  0   0
10  1   17  9   3
11  1   1   21  2
12  1   0   3   1
13  1   4   20  3
14  1   8   22  0
15  1   16  23  2
16  1   0   3   1
17  1   4   20  3
18  1   19  17  1
19  1   12  0   0

对于每个 ID,我想计算 c3 中的值(将它们视为类别),然后将值除以 id 的长度。

例如: ID = 0 有 10 个观察值,c3.0 中 3 个,c3.1 中 3 个,c3.2 中 3 个,c3.3 中 1 个 ID = 1 有 10 个观测值,c3.0 中有 2 个,c3.1 中有 3 个,c3.2 中有 2 个,c3.3 中有 3 个

我想获得这样的东西:

ID c3.0  c3.1  c3.2   c3.3
0   0.3   0.3   0.3    0.1
1   0.2   0.3   0.2    0.3

列的名称不相关

感谢您的帮助!

heiheiliangliang 回答:如何按 ID 分组并获取每个类别的计数

我们可以使用 groupby value_countsnormalize=True 来计算每个 'id' 的 'c3' 出现次数,这些 'id' 按组的总长度归一化。然后 unstack 得到宽格式:

out = df.groupby('id')['c3'].value_counts(normalize=True).unstack()

out

c3    0    1    2    3
id                    
0   0.3  0.3  0.3  0.1
1   0.2  0.3  0.2  0.3

使用 add_prefix 进行一些清理以更新列标题,并使用 reset_index 使 id 成为一列:

out = (
    df.groupby('id')['c3'].value_counts(normalize=True)
        .unstack()
        .rename_axis(columns=None)
        .add_prefix('c3.')
        .reset_index()
)

out

   id  c3.0  c3.1  c3.2  c3.3
0   0   0.3   0.3   0.3   0.1
1   1   0.2   0.3   0.2   0.3
,

您可以使用 crosstab :

result = pd.crosstab(df.id,df.c3,normalize='index')

重命名列:

result.columns = [f'{result.columns.name}.{label}' for label in result.columns]


result.rename_axis(None)
 
   c3.0  c3.1  c3.2  c3.3
0   0.3   0.3   0.3   0.1
1   0.2   0.3   0.2   0.3
本文链接:https://www.f2er.com/18984.html

大家都在问