我有一个运动员数据框,其中包括他们的运动员 ID、团队 ID、姓名和在某场比赛中的得分。每队最多可有 20 名运动员:
当前:
AthleteID TeamID Name Score
1 2 Bob 4.9
2 1 Pete 4.6
3 2 Steve 4.5
4 1 Jim 3.6
5 3 Frank 4.2
我希望每队一行,按得分对运动员进行排序,并将他们的信息作为带有排名的列,如下所示:
想要的:
TeamID AthleteID_1 Name_1 Score_1 AthleteID_2 Name_2 Score_2
1 2 Pete 4.6 4 Jim 3.6
2 1 Bob 4.9 3 Steve 4.5
3 5 Frank 4.2 None None None
按 TeamID 分组后,如何按分数排序并创建这些新列?我目前正在迭代地执行此操作,我知道这不是最有效或Pythonic 的方法。
groupby.rank
然后pivot
:
out = (df.assign(rank=df.groupby('TeamID')['Score']
.rank('dense', ascending=False).astype(int))
.pivot(index='TeamID', columns='rank')
.sort_index(level=1, axis=1, sort_remaining=False)
)
out.columns = out.columns.map(lambda x: f'{x[0]}_{x[1]}')
out.reset_index(inplace=True)
输出:
TeamID AthleteID_1 Name_1 Score_1 AthleteID_2 Name_2 Score_2
0 1 2.0 Pete 4.6 4.0 Jim 3.6
1 2 1.0 Bob 4.9 3.0 Steve 4.5
2 3 5.0 Frank 4.2 NaN NaN NaN