sportsreference爬取NBA赛程时为DataFrame添加所属球队列
问题解决方法
只需要在拉取单支球队赛程时提前给数据打上球队标识,再合并总表,就能直接得到带team字段的完整赛程表,不会出现记录和球队错配的问题。
推荐改造代码(兼容新版pandas,运行效率更高)
from sportsreference.nba.schedule import Schedule import pandas as pd # 全量NBA球队列表,将原代码单独初始化的MIL纳入列表统一处理,逻辑更简洁 league = ['MIL','CHO','LAL','LAC','SAC','ATL','MIA','DAL','POR', 'HOU','NOP','PHO','WAS','MEM','BOS','DEN','TOR','SAS', 'PHI','BRK','UTA','IND','OKC','ORL','MIN','DET', 'NYK','CLE','CHI','GSW'] schedule_dfs = [] for team in league: # 拉取单队指定赛季的赛程数据 team_schedule = Schedule(team, year="2020").dataframe # 新增team列,当前队所有赛程记录统一赋值为对应球队缩写 team_schedule['team'] = team schedule_dfs.append(team_schedule) # 一次性合并所有球队赛程,重置索引避免重复 league_schedule = pd.concat(schedule_dfs).reset_index(drop=True)
改造说明
- 取消原代码单独初始化MIL队赛程的写法,将所有球队放入统一列表循环处理,避免重复写赋值逻辑,后续增减球队也更方便
- 每支球队的赛程拉取后立刻打所属球队标识,从根源避免记录和主队对应错误的问题
- 用
pd.concat一次性合并所有单队数据表,代替原代码逐次append的写法,运行速度更快,同时兼容pandas 2.0及以上版本(新版pandas已经移除了DataFrame.append方法) - 合并后调用
reset_index(drop=True)重置行索引,避免多队数据合并后出现索引重复的问题
最小改动方案(适配原有代码结构)
如果不想调整原有代码的书写逻辑,只需要加两行代码即可实现需求:
- 初始化MIL队赛程后,新增一行给MIL的记录打标识:
league_schedule['team'] = 'MIL' - 循环内追加数据前,先给当前球队的赛程打上对应标识,改造后的循环代码如下:
league_schedule = Schedule('MIL', year="2020").dataframe league_schedule['team'] = 'MIL' for team in league: cur_team_df = Schedule(team , year="2020").dataframe cur_team_df['team'] = team league_schedule = league_schedule.append(cur_team_df)
注意:该写法仅适用于pandas 1.x版本,新版pandas运行会报属性错误,优先推荐前面的concat写法。
运行改造后的代码,得到的league_schedule就会包含team列,字段顺序和取值完全匹配你需要的目标表结构。
内容的提问来源于stack exchange,提问作者schmidtm35
相关产品推荐
相关产品推荐

