对于以下示例数据框,我正在处理 grouby class
并按降序排列 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
最佳答案
方法='密集'
默认排名使用平均值
来解决平局问题。 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 - 对 Pandas 中的一列进行分组并根据另一列进行降序排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57619147/