微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 如何获得Pandas中groupby之后的列计数百分比

我正在尝试在数据列表中获取每个等级的等级分布.
但是,我无法弄清楚如何获得每个年级的比例/百分比超过其等级组.这是一个例子:

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    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    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(级别[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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐