python - 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 的解决方案,除以总行数等。
谢谢!
解决方案
您可以聚合然后划分列sum
:size
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
使用布尔掩码的值 - True
s 是类似1
s 的过程:
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-2.7 - 如何在金字塔响应中发送“%”
- python - python google geolocation api使用wifi mac
- pseudocode - 伪代码:这有意义吗?
- android - 改造 2:execute().body() 方法停止并且什么都不给我(没有错误,当然不是我的数据)
- java - 在 ImageView 中设置位图图像
- scala - Scala案例类中init方法的java.lang.NoSuchMethodException
- haskell - 如何从 Haskell 链接到 C#(即托管)DLL?
- reactjs - 返回一组单元格
- java - recycler view 数据如何绑定?
- highcharts - sankey-diagram(跳过列)highcharts