我试图在我加载到python中的数据帧上运行Glicko v2计算。由于每场比赛都是独立的,我只能比较那些在同一场比赛中参赛的运动员。
import pandas as pd
import numpy as np
df = pd.read_excel("MyDirectory/sample.xlsx")
Athlete Race_Id Rank Ranking RD
A Race1 1 1500 0.0000
B Race1 2 1350 27.3220
C Race1 3 1700 11.2342
D Race2 1 1480 80.8880
E Race2 2 1500 0.8923
F Race2 3 1325 8.0090
我想要的输出看起来像这样。
Athlete1 Race_Id Ranking RD Athlete2 Ranking 2 RD2
A Race1 1500 0.0000 B 1350 27.3220
A Race1 1500 0.0000 C 1700 11.2342
B Race1 1350 27.3220 C 1700 11.2342
D Race2 1480 80.8880 E 1500 0.8923
D Race2 1480 80.8880 F 1700 11.2342
E Race2 1500 0.8923 F 1700 11.2342
我在这背后的想法是,如果我操纵数据框看起来像上面的那个,我可以用我想要的计算轻松定义函数并将它们应用到所述数据框。
为了获得我想要的数据帧。我想我会引用每个种族的最后一行并创建一个匹配数据框元素的for循环。
data_lr= df.groupby(['Race_Id']).tail(1)
Athlete Race_Id Rank Ranking RD
C Race1 3 1700 11.2342
F Race2 3 1325 8.0090
我在努力创建创建新数据帧所需的for循环?任何指导都会受到赞赏,或者完成我的目标的不同方法也是有益的。谢谢,
答案 0 :(得分:1)
我们可以使用笛卡尔自连接和过滤来创建结果数据框:
(df.merge(df, on='Race_Id',suffixes=('1','2'))
.query('Rank1 != Rank2 and Athlete1 < Athlete2')
[['Athlete1','Race_Id','Ranking1','RD1','Athelete2','Ranking2','RD2']])
(df.merge(df, on='Race_Id',suffixes=df.Race_Id.str.extract('Race(\d+)')[0].unique())
.query('Rank1 != Rank2 and Athlete1 < Athlete2')
[['Athlete1','Race_Id','Ranking1','RD1','Athlete2','Ranking2','RD2']])
输出:
Athlete1 Race_Id Ranking1 RD1 Athlete2 Ranking2 RD2
1 A Race1 1500 0.0000 B 1350 27.3220
2 A Race1 1500 0.0000 C 1700 11.2342
5 B Race1 1350 27.3220 C 1700 11.2342
10 D Race2 1480 80.8880 E 1500 0.8923
11 D Race2 1480 80.8880 F 1325 8.0090
14 E Race2 1500 0.8923 F 1325 8.0090