You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中实现类似Excel VLOOKUP的合并操作匹配赛事盘口

匹配失败的核心原因

    1. merge参数使用错误:merge方法的right_on参数需要传入右侧表的列名,你当前传的是odds['Favorite']这个完整Series,匹配逻辑完全不符合预期,导致绝大多数行无法正确关联
    1. 盘口数据的结构问题:你当前的odds表一行对应一场比赛的两支球队,直接用Spread列和两侧匹配的话,Underdog对应的让分应该是Spread2列的正值,而非Favorite的负Spread值,就算匹配上数值也不符合要求
    1. 两次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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 09:45:04