Pandas Dataframe - 分组、排名和扁平化而不聚合

问题描述 投票:0回答:1

我有一个运动员数据框,其中包括他们的运动员 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 的方法。

python-3.x pandas
1个回答
0
投票

您可以

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
© www.soinside.com 2019 - 2024. All rights reserved.