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

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)

代码说明

  1. 添加球员ID列:在生成每个球员的DataFrame后,直接通过df['player_id'] = player添加字符串类型的ID列
  2. 函数返回DataFrame:修改callapi函数逻辑,让它返回处理完成的DataFrame,而非仅打印
  3. 合并DataFrame:用列表存储每个球员的有效数据,最后通过pd.concat合并所有DataFrame,ignore_index=True重置总表索引避免重复
  4. 异常处理:加入try-except块捕获请求或解析错误,防止单个球员数据异常导致整个程序中断

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 05:10:56