如何在 Pandas 中的 groupby 之后获取列的计数百分比

How to get percentage of counts of a column after groupby in Pandas

我正在尝试获取数据列表中姓名的每个排名的成绩分布。 但是,我无法弄清楚如何在其等级组中获得每个等级的 proportion/percentage 。这是一个例子:

df.head()

name    rank    grade
Bob     1       A
Bob     1       A
Bob     1       B
Bob     1       C
Bob     2       B
Bob     3       C
Joe     1       C
Joe     2       B
Joe     2       B
Joe     3       A
Joe     3       B
Joe     3       B

我使用 grade_count = df.groupby(['name', 'rank', 'grade']).['grade'].size()) 给我它的 (name,rank) 组中每个年级的计数:

name    rank    grade
Bob     1       A     2
                B     1
                C     1
        2       B     1
        3       C     1
Joe     1       C     1
        2       B     2
        3       A     1
                B     2

现在对于计算的每个尺寸,我想得到它在 (name,rank) 组中的比例(即一个等级在一个系统中的比例是多少)这是我想要的输出:

name    rank    grade
Bob     1       A     2    0.5   (Bob @ rank 1 had 4 grades, and 50% of them are A's)
                B     1    0.25
                C     1    0.25
        2       B     1    1
        3       C     1    1
Joe     1       C     1    1
        2       B     2    1
        3       A     1    0.33
                B     2    0.66

我已经设法通过使用 rank_totals = grade_count.groupby(level[0,1]).sum() 得到每个排名组的总数,结果是:

name    rank    
Bob     1       4
        2       1
        3       1
Joe     1       1
        2       2
        3       3

如何将 grade_count 中的数字除以它们在 rank_totals 中的相应排名总数?

按名称和排名级别对您的数据进行分组,然后使用 transform 获取您系列的总数并将其广播到整个系列。用那个系列来划分当前系列:

grade_count.groupby(level = [0,1]).transform(sum)
Out[19]: 
name  rank  grade
Bob   1     A        4
            B        4
            C        4
      2     B        1
      3     C        1
Joe   1     C        1
      2     B        2
      3     A        3
            B        3
dtype: int64

grade_count / grade_count.groupby(level = [0,1]).transform(sum)
Out[20]: 
name  rank  grade
Bob   1     A        0.500000
            B        0.250000
            C        0.250000
      2     B        1.000000
      3     C        1.000000
Joe   1     C        1.000000
      2     B        1.000000
      3     A        0.333333
            B        0.666667