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)
然后在计算百分比后删除重复列。看起来很简单,但我似乎无法让它发挥作用。任何帮助表示赞赏。
使用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_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
Run Code Online (Sandbox Code Playgroud)
div并sum与level=0df.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)