python - Groupby 并根据 Pandas 中的另一列对一列进行降序排列
问题描述
对于以下示例数据框,我正在使用 groubyclass
并对score
.
stu_id class name score
0 1 A Jack 45
1 2 A Oscar 75
2 3 B Emile 60
3 4 B Sophie 64
4 5 B Jim 85
5 6 A Thomas 55
6 7 A David 60
7 8 B Lee 60
8 9 B Elvis 70
9 10 A Frank 75
10 11 A James 90
我努力了:
df['rank'] = df.groupby(['class'])['score'].rank(ascending=True)
df
结果:
stu_id class name score rank
0 1 A Jack 45 1.0
1 2 A Oscar 75 4.5
2 3 B Emile 60 1.5
3 4 B Sophie 64 3.0
4 5 B Jim 85 5.0
5 6 A Thomas 55 2.0
6 7 A David 60 3.0
7 8 B Lee 60 1.5
8 9 B Elvis 70 4.0
9 10 A Frank 75 4.5
10 11 A James 90 6.0
但是我的预期输出应该是这样的,为什么我的代码不起作用?谢谢。
stu_id class name score rank
0 1 A Jack 45 1
1 2 A Oscar 75 4
2 3 B Emile 60 1
3 4 B Sophie 64 2
4 5 B Jim 85 4
5 6 A Thomas 55 2
6 7 A David 60 3
7 8 B Lee 60 1
8 9 B Elvis 70 3
9 10 A Frank 75 4
10 11 A James 90 5
解决方案
method='dense'
默认排名用于average
解决平局。A组Oscar和Frank同分,这和4、5名有关系。'average'
逻辑上,都设置为4.5:(4+5)/2,只要有下一个值就排6与它没有任何联系,詹姆斯就是这种情况。使用'dense'
时,关系被赋予较低的排名(4
在这种情况下),然后下一个不同的值继续排名为 5。
df['rank'] = df.groupby(['class'])['score'].rank(method='dense').astype(int)
stu_id class name score rank
0 1 A Jack 45 1
1 2 A Oscar 75 4
2 3 B Emile 60 1
3 4 B Sophie 64 2
4 5 B Jim 85 4
5 6 A Thomas 55 2
6 7 A David 60 3
7 8 B Lee 60 1
8 9 B Elvis 70 3
9 10 A Frank 75 4
10 11 A James 90 5
推荐阅读
- python - 如何在 Google ML Engine 上部署使用自定义包训练的模型?
- php - 有没有从 Laravel 应用程序进行 Moodle 单点登录的方法?
- python - Python + Pandas + dataframe + Csv:将计算值存储在列的末尾
- python - 使用 plt.imshow() 创建叠加频谱图
- java - Kafka Streams:如何获取 SessionWindow 的第一条和最后一条记录?
- python-3.x - 合并 2 列上的两个数据框
- react-native - 如何在移动浏览器上打开的 Highcharts 工具提示中添加链接?
- r - 在 R 中的特定条件下过滤数据集
- android - @Ignore 和不可变字段的问题
- python - 如何在需要之前停止用户输入?