如何在Pandas中实现类似Excel VLOOKUP的合并操作匹配赛事盘口
匹配失败的核心原因
- merge参数使用错误:
merge方法的right_on参数需要传入右侧表的列名,你当前传的是odds['Favorite']这个完整Series,匹配逻辑完全不符合预期,导致绝大多数行无法正确关联
- merge参数使用错误:
- 盘口数据的结构问题:你当前的odds表一行对应一场比赛的两支球队,直接用Spread列和两侧匹配的话,Underdog对应的让分应该是
Spread2列的正值,而非Favorite的负Spread值,就算匹配上数值也不符合要求
- 盘口数据的结构问题:你当前的odds表一行对应一场比赛的两支球队,直接用Spread列和两侧匹配的话,Underdog对应的让分应该是
- 两次merge的结果没有合并:你两次left join后生成了两个独立的Spread列,同一行只会在其中一列有值,没有合并成统一的让分列,所以大部分行显示为空
正确实现逻辑
先把odds表从「一行对应一场比赛」的宽表,转为「一行对应一支球队+周数」的长表,再和球员统计表合并即可,代码示例:
import pandas as pd # 读取数据 df = pd.read_excel('Fantasy2015.xlsx') odds = pd.read_excel('Odds2015Wk1.xlsx') # 预处理:清除球队名前缀 odds['Favorite'] = odds['Favorite'].str.lstrip('at') odds['Underdog'] = odds['Underdog'].str.lstrip('at') # 周数类型统一 df['Week'] = df['Week'].astype(int) odds['Week'] = odds['Week'].astype(int) # 如果你所有odds都是第1周也可以保留写死1的逻辑 # 把odds转为长表:每一行是 球队-周数-对应让分 odds_long = pd.concat([ # 热门球队:取Spread列的让分 odds[['Favorite', 'Week', 'Spread']].rename(columns={'Favorite': 'Tm'}), # 冷门球队:取Spread2列的让分 odds[['Underdog', 'Week', 'Spread2']].rename(columns={'Underdog': 'Tm', 'Spread2': 'Spread'}) ], ignore_index=True) # 生成合并键 odds_long['merge_key'] = odds_long['Tm'] + odds_long['Week'].astype(str) df['merge_key'] = df['Tm'] + df['Week'].astype(str) # 一次合并完成 df = df.merge(odds_long[['merge_key', 'Spread']], on='merge_key', how='left') # 可选:删除临时生成的merge_key列 df.drop('merge_key', axis=1, inplace=True)
内容的提问来源于stack exchange,提问作者RookiePython
相关产品推荐
相关产品推荐

