获取基于另一列但具有不同类别的列的百分比

Get percentages of a column based off of another column but with different categories

我有以下 Pandas 系列:

                    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 的类别(不是计数的总和)。如果这些就好了 仅使用计数列计算百分比。

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

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

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

80 / 216 * 100 = 37.0%

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

使用GroupBy.transform for return Series with same size as original DataFrame, divide by div, multiple by mul and if necessary 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

编辑:

dont you have to forward fill on 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

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

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

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

divsum 以及 level=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