【问题标题】:Get percentages of a column based off of another column but with different categories获取基于另一列但具有不同类别的列的百分比
【发布时间】:2019-03-02 23:23:39
【问题描述】:

我有以下熊猫系列:

                    Count
Pclass  Survived    
1       0            80
        1           136
2       0            97
        1            87
3       0           372
        1           119

但我想要这样的东西:

                    Count   Percentage
Pclass  Survived       
1       0           80      37.0
        1           136     63.0
2       0           97      52.7
        1           87      47.3
3       0           372     75.8
        1           119     24.2

我想仅根据每个中的计数来计算百分比 Pclass 的类别(不是计数的总和)。如果这些就好了 百分比仅使用 Count 列计算。

到目前为止,我所做的只是根据 Pclass 汇总计数并使用 .repeat() 复制值并尝试将其连接到原始系列,但失败了。

        Count
Pclass  
1       216
1       216
2       184
2       184
3       491
3       491

我的想法是使用这个重复列作为计算百分比的分母,如下所示:

80 / 216 * 100 = 37.0%

然后在计算百分比后删除重复列。看起来很简单,但我似乎无法让它工作。任何帮助表示赞赏。

【问题讨论】:

    标签: python pandas dataframe percentage series


    【解决方案1】:

    divsumlevel=0

    df.assign(Pct=df.div(df.sum(level=0), level=0).round(2) * 100)
    
                     Count   Pct
    Pclass Survived             
    1      0            80  37.0
           1           136  63.0
    2      0            97  53.0
           1            87  47.0
    3      0           372  76.0
           1           119  24.0
    

    【讨论】:

    • 这正是我想要的。
    【解决方案2】:

    您正在处理泰坦尼克号数据集。您也可以对原始数据执行以下操作(而不是上面的系列):

    df.Survived.groupby(df.Pclass).value_counts(normalize=True)*100
    

    它将以百分比而不是实际数量为您提供每个班级的计数。

    【讨论】:

    • 谢谢,这也有效。但是,您如何将其变成我上面要求的格式,包括 Count 和 Percentage 两列?
    • 它只是另一种获取百分比的方法,而不是您想要的确切格式。上面@jezrael 的回答非常棒。
    【解决方案3】:

    使用GroupBy.transform返回Series,大小与原始DataFrame相同,除以div,乘以mul,必要时round

    #if input is Series create one column DataFrame
    df = s.to_frame('Count')
    
    s = df.groupby('Pclass')['Count'].transform('sum')
    #if use oldier pandas version
    #s = df.groupby(level='Pclass')['Count'].transform('sum')
    
    df['Percentage'] = df['Count'].div(s).mul(100).round()
    print (df)
                     Count  Percentage
    Pclass Survived                   
    1      0            80        37.0
           1           136        63.0
    2      0            97        53.0
           1            87        47.0
    3      0           372        76.0
           1           119        24.0
    

    编辑:

    您不必在 PClass 上转发填充吗?

    没有必要,因为 MultiIndex 中的默认值不显示,但如果将 multi_sparse 设置为 False 可以验证重复值:

    with pd.option_context('display.multi_sparse', False):
        print (df)
                     Count
    Pclass Survived       
    1      0            80
    1      1           136
    2      0            97
    2      1            87
    3      0           372
    3      1           119
    

    【讨论】:

    • 嗨@jezrael,你不需要转发PClass吗?
    • @VishnuKunchur - 不,因为 MultiIndex
    猜你喜欢
    • 2020-11-23
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 2021-09-28
    • 2019-07-07
    • 2021-06-22
    • 2021-09-05
    • 2017-02-24
    相关资源
    最近更新 更多