gpt4 book ai didi

python - Pandas - 在一列中显示值的百分比,按另一列分组

转载 作者:行者123 更新时间:2023-11-28 22:16:26 25 4
gpt4 key购买 nike

所以我有一个包含两列的 Pandas DataFrame:第一个是 Grade,值为 0 到 9第二个是 Criteria,值为 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

等等

我需要计算“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 的解决方案,除以总行数等。

谢谢!

最佳答案

您可以将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')

对于使用 bool 掩码的 yes/no 值 - True 是类似于 1 的过程:

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

关于python - Pandas - 在一列中显示值的百分比,按另一列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52186250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com