首页 > 解决方案 > 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

标签: pythonpandas

解决方案


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

推荐阅读