例如,我创建一个 pandas 数据框:
data = [['nick', 3, '2023/11/22 10:05:00', 'A'], ['tom', 3, '2023/11/22 9:25:00','A'], ['juli', 2, '2023/11/22 12:05:00', 'B'], ['ewa', 4, '2023/11/22 9:55:00', 'B'],['peter', 5, '2023/11/22 11:00:00', 'A'], ['johan', 5, '2023/11/22 9:00:00', 'C']]
col_name = ['name', 'score', 'time', 'category']
df = df = pd.DataFrame(data, columns=col_name)
有六名来自不同组的学生,他们在一次考试中的成绩不同。我想将来自同一组的学生分组在一起,然后将他们在组中从最高分到最低分进行排序。然后我想将得分最高的组放在数据帧的开头,然后是得分较低的组。如果两个学生成绩相同,则时间早的排在第一位。
我尝试了代码:
df_sorted=df.sort_values(['group','score'],ascending=False).groupby('group').apply(lambda x: x)
它将学生分组并将他们分在同一组中。我现在拥有的新数据框:
它只部分实现了我需要做的事情。 Peter 的分数高于 Eva 和 Juli,因此 Peter、Nick 和 Tom 应该放在 Johan 的正下方,其次是 Ewa 和 Juli。汤姆应该放在尼克前面,因为时间较早。
接下来我应该做什么才能实现目标?
您可以使用:
out = (df
.assign(total=df.groupby('category')['score'].transform('max'))
.sort_values(by=['total', 'category', 'score', 'time'],
ascending=[False, True, False, True]
)
)