首页 > 解决方案 > 每个类别的分数计数

问题描述

我有一个类似的数据框

ID  category  fraction_0  fraction 1
A    1         1/3         2/3
A    1         1/3         2/3
A    0         1/3         2/3 
C    1         0/1         1/1
B    0         1/1         0/1

fraction_0 和 fraction_1 是输出。fraction_0 是按 ID 分组的,在 ID A 中,类别中有多少是 0。以 A 为例,在 3 个 A 中,有 1 个 0 和 2 个 1。所以 fraction_0 是 1/3,fraction_1 是 2/3。

我的代码如下所示

df.groupby('ID')['category'].agg(lamda x: x/x.sum())

但是,这段代码并不能帮助我对 0 和 1 进行分类。有人知道如何解决这个问题吗?

标签: pythonpandas

解决方案


使用groupby+ value_countswithnormalize=True来获取分数。然后我们需要重新整形并将merge结果恢复到原来的样子。

res = (df.groupby('ID')['category']      # For category within each ID
        .value_counts(normalize=True)    # Calculate %
        .unstack(-1)                     # Each category to a column
        .fillna(0)                       # No occurrences -> 0%
        .add_prefix('fraction_'))        # Modify column names

df = df.merge(res, on='ID', how='left')

  ID  category  fraction_0  fraction_1
0  A         1    0.333333    0.666667
1  A         1    0.333333    0.666667
2  A         0    0.333333    0.666667
3  C         1    0.000000    1.000000
4  B         0    1.000000    0.000000

推荐阅读