获取基于另一列但具有不同类别的列的百分比
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 的计数。
div
和 sum
以及 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
我有以下 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 的计数。
div
和 sum
以及 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