如何基于双ID合并两个Pandas DataFrame并匹配球员信息与赔率?
Pandas DataFrame合并解决方案:匹配球员ID与赛事信息,添加姓名和赔率
核心思路
由于result_df的player1_id可能对应betting_lines_24的winner_id或loser_id,且赛事顺序不匹配,必须通过赛事信息+球员ID的组合键进行精准匹配,不能依赖行索引。
具体实现步骤
拆分赔率表为胜者/负者子表
把betting_lines_24拆成两个子表,分别对应赛事中的胜者和负者,并重命名列名,方便后续和result_df的player1_id对齐:import pandas as pd # 替换为你实际的赛事信息列名(比如'match_id') match_col = "赛事信息列名" # 处理胜者数据 winner_df = betting_lines_24[[match_col, 'winner_id', 'winner_name', 'winner_odds']].rename( columns={ 'winner_id': 'player1_id', 'winner_name': 'player_name', 'winner_odds': 'player_odds' } ) # 处理负者数据 loser_df = betting_lines_24[[match_col, 'loser_id', 'loser_name', 'loser_odds']].rename( columns={ 'loser_id': 'player1_id', 'loser_name': 'player_name', 'loser_odds': 'player_odds' } )合并为统一的球员-赔率映射表
将胜者和负者子表合并,得到一个包含所有球员(无论胜负)与对应赛事、赔率、姓名的映射表:player_betting_map = pd.concat([winner_df, loser_df], ignore_index=True)与原表合并,保留原结构
使用merge方法,以赛事信息列+player1_id为连接键,将映射表的信息合并到result_df中:# 用how='left'确保保留result_df的所有原始行,未匹配到的记录会显示NaN final_df = pd.merge( result_df, player_betting_map, on=[match_col, 'player1_id'], how='left' )
关键注意事项
- 确保两个DataFrame中的赛事信息列值完全一致:比如检查是否有空格、大小写差异或类型不匹配,必要时先做数据清洗(如
str.strip()、astype(str))。 - 若
betting_lines_24中存在同一赛事+球员ID的重复数据,合并后会产生重复行,可提前用player_betting_map.drop_duplicates(subset=[match_col, 'player1_id'], inplace=True)去重。
内容的提问来源于stack exchange,提问作者Anton G
相关产品推荐
相关产品推荐

