基于目标值在Pandas DataFrame中计算网球选手交手记录问题排查
解决网球比赛交手记录统计错误问题
问题核心
你的代码错误出在没有统一选手配对的统计逻辑——当比赛中Player1失利(target=0)时,没有正确对应到Player2的胜场,且后续比赛如果选手顺序调换,会因为配对键不统一导致统计混乱。
解决方案
通过统一选手配对的唯一键,确保同一对选手的交手记录始终存在同一个条目下,再按比赛顺序正确更新胜场数:
- 初始化一个字典存储所有选手对的交手记录,键为排序后的选手名字元组(比如
('Federer', 'Nadal'),不管谁在比赛中是Player1还是Player2,键都一致)。 - 按比赛时间顺序遍历每行数据,先读取当前比赛前的历史交手记录,赋值到
player1_h2h和player2_h2h。 - 根据比赛结果(target值),正确累加获胜选手的胜场数到字典中。
修正后的代码
# 初始化交手记录字典 h2h_records = {} # 新增h2h列并初始化 tennis_data_processed['player1_h2h'] = 0 tennis_data_processed['player2_h2h'] = 0 # 确保数据按比赛日期升序排列(必须步骤!) tennis_data_processed = tennis_data_processed.sort_values('比赛日期列名').reset_index(drop=True) # 遍历每一场比赛 for idx, row in tennis_data_processed.iterrows(): p1 = row['Player1'] p2 = row['Player2'] target = row['target'] # 生成排序后的选手配对键,保证同一对选手键唯一 sorted_pair = tuple(sorted([p1, p2])) # 初始化该配对的记录(如果不存在) if sorted_pair not in h2h_records: h2h_records[sorted_pair] = [0, 0] # [排序第一个选手胜场, 排序第二个选手胜场] # 确定当前选手在排序对中的位置,获取历史胜场数 if p1 == sorted_pair[0]: p1_hist_wins = h2h_records[sorted_pair][0] p2_hist_wins = h2h_records[sorted_pair][1] else: p1_hist_wins = h2h_records[sorted_pair][1] p2_hist_wins = h2h_records[sorted_pair][0] # 写入当前比赛前的交手记录 tennis_data_processed.at[idx, 'player1_h2h'] = p1_hist_wins tennis_data_processed.at[idx, 'player2_h2h'] = p2_hist_wins # 根据比赛结果更新交手记录 if target == 1: # Player1获胜,对应他在排序对中的位置胜场+1 if p1 == sorted_pair[0]: h2h_records[sorted_pair][0] += 1 else: h2h_records[sorted_pair][1] += 1 else: # Player2获胜,对应他在排序对中的位置胜场+1 if p2 == sorted_pair[0]: h2h_records[sorted_pair][0] += 1 else: h2h_records[sorted_pair][1] += 1
关键说明
- 必须确保DataFrame按比赛日期升序排列,否则统计的历史记录会包含未发生的比赛,导致结果错误。
- 排序后的配对键彻底解决了选手顺序调换导致的记录分散问题,不管哪场比赛谁在前,同一对选手的交手数据都存在同一个键下。
- 先读取历史记录再更新,保证
player1_h2h和player2_h2h存储的是当前比赛之前的交手胜场数,符合需求。
内容的提问来源于stack exchange,提问作者Anton G
相关产品推荐
相关产品推荐

