【问题标题】:Pandas groupwise percentage熊猫分组百分比
【发布时间】:2016-09-08 10:41:51
【问题描述】:

如何计算 pandas 中的分组百分比?

类似于 Pandas: .groupby().size() and percentagesPandas Very Simple Percent of total size from Group by 我想计算每组值的百分比。

我怎样才能做到这一点?

我的数据集的结构类似于

ClassLabel, Field

最初,我对ClassLbelField 都进行了汇总

grouped = mydf.groupby(['Field', 'ClassLabel']).size().reset_index()
grouped = grouped.rename(columns={0: 'customersCountPerGroup'})

现在我想知道每个组中每个组的客户百分比。可以像mydf.groupby(['Field']).size() 一样获得组总数,但我既不能将其合并为一列,也不能确定这是正确的方法 - 一定有更简单的方法。

编辑

我想仅基于单个组计算百分比,例如3 0 0.125 1 0.250 0 + 1 --> 0.125 + 0.250 = 0,375 的总和,并使用此值来划分/归一化分组而不是分组.sum()

【问题讨论】:

    标签: python pandas group-by percentage


    【解决方案1】:

    你可以使用的IIUC:

    mydf = pd.DataFrame({'Field':[1,1,3,3,3],
                       'ClassLabel':[4,4,4,4,4],
                       'A':[7,8,9,5,7]})
    
    print (mydf)
       A  ClassLabel  Field
    0  7           4      1
    1  8           4      1
    2  9           4      3
    3  5           4      3
    4  7           4      3
    
    grouped = mydf.groupby(['Field', 'ClassLabel']).size()
    print (grouped)
    Field  ClassLabel
    1      4             2
    3      4             3
    dtype: int64
    
    print (100 * grouped / grouped.sum())
    Field  ClassLabel
    1      4             40.0
    3      4             60.0
    dtype: float64
    

    grouped = mydf.groupby(['Field', 'ClassLabel']).size().reset_index()
    grouped = grouped.rename(columns={0: 'customersCountPerGroup'})
    print (grouped)
       Field  ClassLabel  customersCountPerGroup
    0      1           4                       2
    1      3           4                       3
    
    grouped['per'] = 100 * grouped.customersCountPerGroup / grouped.customersCountPerGroup.sum()
    print (grouped)
       Field  ClassLabel  customersCountPerGroup   per
    0      1           4                       2  40.0
    1      3           4                       3  60.0
    

    通过评论编辑:

    mydf = pd.DataFrame({'Field':[1,1,3,3,3,4,5,6],
                       'ClassLabel':[0,0,0,1,1,0,0,6],
                       'A':[7,8,9,5,7,5,6,4]})
    
    print (mydf)
    
    grouped = mydf.groupby(['Field', 'ClassLabel']).size()
    df =  grouped / grouped.sum()
    
    df = (grouped / df.groupby(level=0).transform('sum')).reset_index(name='new')
    print (df)
       Field  ClassLabel       new
    0      1           0  8.000000
    1      3           0  2.666667
    2      3           1  5.333333
    3      4           0  8.000000
    4      5           0  8.000000
    5      6           6  8.000000
    

    【讨论】:

    • 但如果我不想使用grouped.sum() 但真的分别为每个组执行此操作,例如使用字段 1 的类 0 和类 1 的总和作为总数。我怎样才能访问它?
    • 抱歉,您可以将其添加到问题中,输入所需的输出是什么?最好是修改或使用我的示例或创建另一个示例,因为我不确定我是否理解您。
    • 好的,我添加了解决方案,但我不确定,如果我理解你的话。请检查一下。
    • 谢谢。确实这就是我想要的。非常感谢。如何将grouped / sum_grouped 创建的列添加到.reset_index() 创建的df?我只得到插入列的不兼容索引
    • df = (mydf.groupby(['Field', 'ClassLabel']).size() / df.groupby(level=0).transform('sum')).reset_index(name='new')
    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 2023-01-26
    • 2021-01-05
    • 2017-03-05
    • 2022-01-16
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多