使用NBA_API获取当日赛事时Python代码返回空DataFrame的原因
问题分析与解决
错误原因
你当前的循环赋值逻辑存在问题:每次循环里todayGames['GAME_ID']=game['gameId']这类操作,是将整列的值覆盖为当前game的对应字段,而非新增一行数据。初始空DataFrame在第一次赋值时会生成一行,但后续循环会持续修改这一行的内容,最终要么只保留最后一条赛事数据,若当日无赛事则直接返回空DataFrame。
修正方案
方案一:先收集数据到列表,再转DataFrame(推荐)
这种方式效率更高,符合Pandas的最佳实践:
from nba_api.live.nba.endpoints import scoreboard import pandas as pd todayBoard = scoreboard.ScoreBoard() games = todayBoard.games.get_dict() # 用列表存储每一行的赛事数据 game_data = [] for game in games: game_row = { 'GAME_ID': game['gameId'], 'AWAY': game['awayTeam']['teamTricode'], 'HOME': game['homeTeam']['teamTricode'] } game_data.append(game_row) # 将列表转换为DataFrame todayGames = pd.DataFrame(game_data) print(todayGames)
方案二:循环中逐行追加(不推荐大量数据场景)
若坚持逐行添加,可使用pd.concat(Pandas 2.0+已弃用append方法):
from nba_api.live.nba.endpoints import scoreboard import pandas as pd todayBoard = scoreboard.ScoreBoard() games = todayBoard.games.get_dict() todayGames = pd.DataFrame() for game in games: # 构造单行DataFrame并追加到主表 row = pd.DataFrame({ 'GAME_ID': [game['gameId']], 'AWAY': [game['awayTeam']['teamTricode']], 'HOME': [game['homeTeam']['teamTricode']] }) todayGames = pd.concat([todayGames, row], ignore_index=True) print(todayGames)
验证结果
运行修正后的代码,2024-03-21会输出预期结果:
GAME_ID AWAY HOME 0 0022301004 NOP ORL 1 0022301005 SAC WAS 2 0022301006 CHI HOU 3 0022301007 BKN MIL 4 0022301008 UTA DAL 5 0022301009 NYK DEN 6 0022301010 ATL PHX
内容的提问来源于stack exchange,提问作者mmyoung77
相关产品推荐
相关产品推荐

