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

如何通过for循环合并多份周度赔率文件的Spread与Total字段到主DF

问题修复方案

问题根因

你在循环内反复执行merge操作时,第一次迭代生成的Spread、Total列会保留在主表中,第二次及之后迭代merge同名字段时,pandas会自动给新列加_x/_y后缀避免冲突,不会把新匹配到的值写入原有Spread/Total列,所以你只能看到第一周的填充结果,其余周的匹配结果都变成了冗余的隐藏新列。

修正后代码

最优方案是先把所有周的赔率数据统一拼接为全量映射表,再和主表做一次合并,既避免列名冲突,运行效率也更高:

import pandas as pd
import numpy as np

# 提前生成主表的合并键,仅需执行1次,避免循环内重复计算
df['Week'] = df['Week'].astype(int)
df['Merge'] = df['Tm'].astype(str) + df['Week'].astype(str)

year = 2015
weeks = np.arange(1,18)
all_odds_list = []

for week in weeks:
    # 读取单周赔率文件
    odds = pd.read_excel(fr'C:\Users\logan\Desktop\Gambling_Scraper\Odds_{year}\Odds{year}Wk{week}.xlsx')
    odds['Favorite'] = odds['Favorite'].map(lambda x: x.lstrip('at '))
    odds['Underdog'] = odds['Underdog'].map(lambda x: x.lstrip('at '))
    odds['UD_Spread'] = odds['Spread'] * -1

    # 构造当周热门队的映射数据
    fav_df = pd.DataFrame({
        'merge_key': odds['Favorite'] + str(week),
        'Spread': odds['Spread'],
        'Total': odds['Total']
    })
    # 构造当周弱势队的映射数据
    ud_df = pd.DataFrame({
        'merge_key': odds['Underdog'] + str(week),
        'Spread': odds['UD_Spread'],
        'Total': odds['Total']
    })
    # 把当周数据加入全局列表
    all_odds_list.append(pd.concat([fav_df, ud_df], ignore_index=True))

# 拼接所有周的映射数据为完整映射表
all_odds_map = pd.concat(all_odds_list, ignore_index=True)

# 仅执行一次合并操作完成所有周数据匹配
df = df.merge(all_odds_map, left_on='Merge', right_on='merge_key', how='left')
# 计算衍生字段
df['Implied Tm Pts'] = df['Total'].astype(float) / 2 - df['Spread'].astype(float) / 2
# 导出最终结果
df.to_excel('DFS2015.xlsx', index=False)

内容的提问来源于stack exchange,提问作者RookiePython

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:36:05