Groupby并根据Pandas中的另一列对一列进行向下排序

2024-05-13 03:38:37 发布

您现在位置:Python中文网/ 问答频道 /正文

对于下面的示例数据帧,我在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

Tags: nameidthomasclassdavidscorejackrank
1条回答
网友
1楼 · 发布于 2024-05-13 03:38:37

method='dense'

默认排名使用average来解析关系。在A组中,Oscar和Frank的得分相同,与排名4和5相关。在'average'逻辑下,两者都设置为4.5:(4+5)/2,下一个值是排名6,只要与之没有关联,James就是这样。使用'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

相关问题 更多 >