Python循环遍历列表时为DataFrame添加球员ID列的实现问题
问题
我从NHL API获取单场比赛的球员数据,现有代码可生成单个球员的DataFrame:
API_URL = "https://statsapi.web.nhl.com/api/v1" response = requests.get(API_URL + "/people/8477956/stats?stats=gameLog", params={"Content-Type": "application/json"}) data = json.loads(response.text) df_list_dict = [] for game in data['stats'][0]['splits']: curr_dict = game['stat'] curr_dict['date'] = game['date'] curr_dict['isHome'] = game['isHome'] curr_dict['isWin'] = game['isWin'] curr_dict['isOT'] = game['isOT'] curr_dict['team'] = game['team']['name'] curr_dict['opponent'] = game['opponent']['name'] df_list_dict.append(curr_dict) df = pd.DataFrame.from_dict(df_list_dict) print(df)
我希望遍历球队球员ID列表,为每个球员的DataFrame添加球员ID列并合并为一个总DataFrame,尝试的代码如下:
import requests import json import pandas as pd Rangers = ['8478550', '8476459', '8479323', '8476389', '8475184', '8480817', '8480078', '8476624', '8481554', '8482109', '8476918', '8476885', '8479324', '8482073', '8479328', '8480833', '8478104', '8477846', '8477380', '8477380', '8477433', '8479333', '8479991'] def callapi(player): response = (requests.get(f'https://statsapi.web.nhl.com/api/v1/people/{player}/stats?stats=gameLog', params={"Content-Type": "application/json"})) data = json.loads(response.text) df_list_dict = [] for game in data['stats'][0]['splits']: curr_dict = game['stat'] curr_dict['date'] = game['date'] curr_dict['isHome'] = game['isHome'] curr_dict['isWin'] = game['isWin'] curr_dict['isOT'] = game['isOT'] curr_dict['team'] = game['team']['name'] curr_dict['opponent'] = game['opponent']['name'] df_list_dict.append(curr_dict) df = pd.DataFrame.from_dict(df_list_dict) print(df) for player in Rangers: callapi(player) print(callapi)
目前能生成多个球员的DataFrame,但无法添加字符串类型的球员ID列,希望得到合并为带球员ID列的单DataFrame的解决方法。
解决方法
要实现需求,需修改三个核心点:让callapi函数返回处理后的DataFrame、给每个球员的DataFrame添加ID列、收集所有DataFrame后合并为总表。
修改后的完整代码如下:
import requests import json import pandas as pd Rangers = ['8478550', '8476459', '8479323', '8476389', '8475184', '8480817', '8480078', '8476624', '8481554', '8482109', '8476918', '8476885', '8479324', '8482073', '8479328', '8480833', '8478104', '8477846', '8477380', '8477380', '8477433', '8479333', '8479991'] def callapi(player): try: response = requests.get(f'https://statsapi.web.nhl.com/api/v1/people/{player}/stats?stats=gameLog', params={"Content-Type": "application/json"}) response.raise_for_status() # 捕获HTTP请求错误 data = json.loads(response.text) df_list_dict = [] for game in data['stats'][0]['splits']: curr_dict = game['stat'] curr_dict['date'] = game['date'] curr_dict['isHome'] = game['isHome'] curr_dict['isWin'] = game['isWin'] curr_dict['isOT'] = game['isOT'] curr_dict['team'] = game['team']['name'] curr_dict['opponent'] = game['opponent']['name'] df_list_dict.append(curr_dict) df = pd.DataFrame.from_dict(df_list_dict) df['player_id'] = player # 添加字符串类型的球员ID列 return df except Exception as e: print(f"处理球员ID {player} 时出错: {e}") return pd.DataFrame() # 返回空DataFrame避免合并出错 # 收集所有球员的有效DataFrame all_players_data = [] for player in Rangers: player_df = callapi(player) if not player_df.empty: all_players_data.append(player_df) # 合并为总DataFrame并重置索引 total_df = pd.concat(all_players_data, ignore_index=True) print(total_df)
代码说明
- 添加球员ID列:在生成每个球员的DataFrame后,直接通过
df['player_id'] = player添加字符串类型的ID列 - 函数返回DataFrame:修改
callapi函数逻辑,让它返回处理完成的DataFrame,而非仅打印 - 合并DataFrame:用列表存储每个球员的有效数据,最后通过
pd.concat合并所有DataFrame,ignore_index=True重置总表索引避免重复 - 异常处理:加入
try-except块捕获请求或解析错误,防止单个球员数据异常导致整个程序中断
内容的提问来源于stack exchange,提问作者cvel
相关产品推荐
相关产品推荐

