在python中操作数据帧以进行Glicko计算

时间:2018-06-05 18:42:21

标签: python pandas dataframe

我试图在我加载到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循环?任何指导都会受到赞赏,或者完成我的目标的不同方法也是有益的。谢谢,

1 个答案:

答案 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