首页 > 解决方案 > Pandas - 显示一列中值的百分比,按另一列分组

问题描述

所以我有一个包含两列的 Pandas DataFrame:第一是等级,值为 0 到 9,第二是标准,值为 0 或 1。

等级(0-9/标准(0/1)

   Grade  Criteria
0      0         1
1      1         0
2      2         1
3      2         0
4      5         1
5      2         1

ETC

我需要计算“Criteria rate”,它实际上是 Criteria 列中“1”的总和,除以 Criteria 列中适当的行数,但按 Grade 列值分组。例如,对于 Grade = 2,我们在 Criteria 列中计算 1 的总和,然后将其除以 Grade 2 的行数:2/3,因此对于 Grade 2,我们得到大约 0.66。在我的示例中,答案应如下所示:

等级/标准率

   Grade  Criteria
0      0  1.000000
1      1  0.000000
2      2  0.666667
3      5  1.000000

任何想法,如何做到这一点?还有加。问题 - 如果我们在 Criteria 列中有“是/否”文本值,如何做到这一点?我在这里搜索过,但只找到了 groupby 的解决方案,除以总行数等。

谢谢!

标签: pythonpandaspercentage

解决方案


您可以聚合然后划分列sumsize

df = df.groupby('Grade')['Criteria'].agg(['sum','size'])
df['new'] = df['sum'] / df['size']
print (df)
       sum  size       new
Grade                     
0        1     1  1.000000
1        0     1  0.000000
2        2     3  0.666667
5        1     1  1.000000

或者使用自定义函数:

#not exclude NaNs 
df = df.groupby('Grade')['Criteria'].agg(lambda x: x.sum() / len(x)).reset_index(name='new')

#exclude possible NaNs
df = df.groupby('Grade')['Criteria'].agg(lambda x: x.sum() / x.count()).reset_index(name='new')

对于yes/no使用布尔掩码的值 - Trues 是类似1s 的过程:

print (df)
   Grade Criteria
0      0      yes
1      1       no
2      2      yes
3      2       no
4      5      yes
5      2      yes

df = (df['Criteria'] == 'yes').groupby(df['Grade']).agg(lambda x: x.sum() / len(x)).reset_index(name='new')
print (df)
   Grade       new
0      0  1.000000
1      1  0.000000
2      2  0.666667
3      5  1.000000

推荐阅读