如何通过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
相关产品推荐
相关产品推荐

