在数据框中循环函数

Posted

技术标签:

【中文标题】在数据框中循环函数【英文标题】:looping a function in a data frame 【发布时间】:2015-08-16 18:39:27 【问题描述】:

我的项目:我正在为网球运动员创建一个 elo 评级,我有两个不同的数据框。

(1)玩家评分的数据框 (2)按时间顺序排列的匹配数据框

在处理比赛数据库时,我想检索两名球员的评分并应用两个函数(我已经定义了它们)predicted_result(rating1, rating2) 和 updated_rating(rating1, rating2)。第一个给出了给定收视率的比赛预期结果,第二个给出了更新后的收视率。最后我需要在玩家数据库中记录更新的评分。

我认为我正在寻找的是逐行循环:

在匹配数据框的第一行,检索来自的评分 玩家数据库 同时运行两个函数 用播放器中的更新评级替换旧评级 数据库。

匹配数据帧

    Winner    Loser   
0   Nadal     Federer   
1   Djokovic  Verdasco   
2   Nadal     Djokovic  
3   Del Potro Verdasco 

玩家数据框

    Player  Rating   
0   Nadal     2320   
1   Djokovic  2280   
2   Verdasco  2120
3   Federer   1890     
4   Del potro 1542 

我在下面找到了指示如何向下滚动公式的答案,但我错过了如何将更新后的评分保存在播放器数据框上

Rolling a function on a data frame

【问题讨论】:

这是一个多部分的问题,理想情况下应该是每个问题 1 个问题。对于第一部分,我会将每场比赛的球员评分添加到比赛中,例如match['winner_rating'] = match['Player'].map(player.set_index('Player')['Rating']),然后对失败者评分进行类似的操作,运行您的公式,然后更新评分 df 【参考方案1】:

这里的主要问题似乎是您的ratings DataFrame 的格式没有帮助。由于索引的目的是使通过索引值访问行变得容易,如果您将播放器命名为索引,问题就会变得容易得多。由于我不知道评分是如何计算的,我假设获胜会使评分增加一分,而输掉评分会降低一分。

首先我确保我使用的数据和你一样:)

In [154]: ratings
Out[154]:
      Player  Rating
0      Nadal    2320
1   Djokovic    2280
2   Verdasco    2120
3    Federer    1890
4  Del Potro    1542

In [155]: results
Out[155]:
      Winner     Loser
0      Nadal   Federer
1   Djokovic  Verdasco
2      Nadal  Djokovic
3  Del Potro  Verdasco

接下来,我以播放器为索引制作评级表的副本。

In [156]: ir = ratings.set_index(ratings["Player"].values)

我选择删除原来的“玩家”列,因为它现在是多余的。 YMMV。

In [157]: del ir["Player"]

In [158]: ir
Out[158]:
           Rating
Nadal        2320
Djokovic     2280
Verdasco     2120
Federer      1890
Del Potro    1542

您可以遍历results 表中的每一列:

In [159]: for row in results["Winner"]:
   .....:         print(row)
   .....:
Nadal
Djokovic
Nadal
Del Potro

所以现在更新您的评分相对简单:

In [160]: for row in results["Winner"]:
   .....:         ir['Rating'][row] += 1
   .....:

In [161]: for row in results["Loser"]:
   .....:         ir['Rating'][row] -= 1
   .....:

In [162]: ir
Out[162]:
           Rating
Nadal        2322
Djokovic     2280
Verdasco     2118
Federer      1889
Del Potro    1543

【讨论】:

以上是关于在数据框中循环函数的主要内容,如果未能解决你的问题,请参考以下文章

.diff() 函数仅在 pandas 数据框中返回 NaN 值

如何在 for 循环中附加熊猫数据框中的行?

在火花数据框中使用 for 循环添加新列

循环子集,获取文件并将结果保存在数据框中

Python:如何在没有循环的数据框中查找值?

循环抓取的数据以将数据存储在 R 中的数据框中