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

Python 如何在Pandas中获取groupby之后的列计数百分比,python,pandas,group-by,aggregate,percentage,Python,Pandas,Group By,Aggregate,Percentage,我试图得到数据列表中每个名字的等级分布。 然而,我不知道如何计算每个等级在其等级组中的比例/百分比。下面是一个例子: df.head() 我使用grade\u count=df.groupby(['name','rank','grade']).['grade'].size())给出其(name,rank)组中每个年级的计数: 现在,对于计算的每个大小,我想得到它在(姓名、等级)组中的比例(即等级在等级、系统中的比例)这是我想要的输出: name rank grade Bob

我试图得到数据列表中每个名字的等级分布。 然而,我不知道如何计算每个等级在其等级组中的比例/百分比。下面是一个例子:

df.head()

我使用
grade\u count=df.groupby(['name','rank','grade']).['grade'].size())
给出其(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\u totals=grade\u count.groupby(level[0,1]).sum()
获得了每个排名组的总数,结果是:

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

如何将
grade\u count
中的数字除以
rank\u 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
欺骗:
name    rank    
Bob     1       4
        2       1
        3       1
Joe     1       1
        2       2
        3       3
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