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

Ism*_*jee 5 python series percentage dataframe pandas

我有以下熊猫系列:

                    Count
Pclass  Survived    
1       0            80
        1           136
2       0            97
        1            87
3       0           372
        1           119
Run Code Online (Sandbox Code Playgroud)

但我想要这样的东西:

                    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
Run Code Online (Sandbox Code Playgroud)

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

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

        Count
Pclass  
1       216
1       216
2       184
2       184
3       491
3       491
Run Code Online (Sandbox Code Playgroud)

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

80 / 216 * 100 = 37.0%
Run Code Online (Sandbox Code Playgroud)

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

jez*_*ael 5

使用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
Run Code Online (Sandbox Code Playgroud)

编辑:

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

这是没有必要的,因为在多指标默认中未示出,但如果设定multi_sparseFalse能够验证重复值:

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
Run Code Online (Sandbox Code Playgroud)


piR*_*red 5

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
Run Code Online (Sandbox Code Playgroud)