【问题标题】:Update value for every row based on either of two previous columns根据前两列中的任何一列更新每一行的值
【发布时间】:2019-03-08 19:33:35
【问题描述】:

我正在研究 ATP Tour 男子网球数据。目前,我有一个包含约 60,000 个匹配项的 Pandas 数据框。每行都包含有关比赛的信息/统计数据,分为赢家和输家。我已经按日期对数据框进行了排序。目前我正在尝试计算每场比赛的获胜者和失败者的 ELO 评级(因此每一行)。 要计算 ELO 等级,需要两位玩家在上一场比赛中的 ELO 等级。另一个困难出现了,因为当前比赛的赢家可能是他上一场比赛的输家。因此,当前比赛的 'winner_player_id' 值可能在前一场比赛的 'loser_player_id' 列中。

我不确定如何有效地为每行的两名玩家选择之前的 ELO 评分,因为这需要跨多个列进行搜索。

每一行包括以下列:

array(['match_id', 'tourney_dates', 'round_order', 'tourney_name',
   'tourney_year_id', 'tourney_round_name', 'winner_player_id',
   'winner_slug', 'loser_player_id', 'loser_slug', 'elo_player_1', 'elo_player_2'])

感谢您的宝贵时间!

【问题讨论】:

标签: python pandas


【解决方案1】:

一种方法是按玩家姓名/ID 对每行中的每个赢家和输家进行排序,因此无论谁输赢,顺序都是稳定的。这是一个例子:

df.join(pd.DataFrame(
    np.sort(df[['winner_name', 'loser_name']].values, axis=1),
    columns=['name1', 'name2']))

df.head(10)

输出:

      winner_name         loser_name              name1          name2
0   Nicklas Kulti      Michael Stich      Michael Stich  Nicklas Kulti
1   Michael Stich        Jim Courier        Jim Courier  Michael Stich
2   Nicklas Kulti     Magnus Larsson     Magnus Larsson  Nicklas Kulti
3     Jim Courier      Martin Sinner        Jim Courier  Martin Sinner
4   Michael Stich        Jimmy Arias        Jimmy Arias  Michael Stich
5   Nicklas Kulti    Fabrice Santoro    Fabrice Santoro  Nicklas Kulti
6  Magnus Larsson      Patrik Kuhnen     Magnus Larsson  Patrik Kuhnen
7     Jim Courier      Paul Haarhuis        Jim Courier  Paul Haarhuis
8   Nicklas Kulti  Magnus Gustafsson  Magnus Gustafsson  Nicklas Kulti
9   Michael Stich        Gilad Bloom        Gilad Bloom  Michael Stich

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多