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

在for循环中为字典重复赋值以匹配pandas表格长度的问题

问题修复方案

问题根源

你当前的写法仅为每个球员追加了1次ID到test['ID']列表,但单个球员的比赛数据表格包含多行数据,ID列表长度远小于表格总数据行数,因此合并后仅首行能匹配到对应ID。

修复代码

import pandas as pd
import requests
from collections import defaultdict
import time

# 推荐用列表存储单球员处理后的表格,最后直接合并更稳妥
df_list = []
headers = {
    # 替换为你自己可用的请求头,避免被反爬拦截
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36'
}

for j,i in enumerate(datas['data'][0:2]):
    p = i.split("/")[-1]
    url = 'https://www.transfermarkt.co.uk/kylian-mbappe/leistungsdatendetails/spieler/{}'.format(p)
    # 加延时避免触发反爬
    time.sleep(2)
    r = requests.get(url, headers=headers)
    try:
        # 读取当前球员的目标表格
        player_df = pd.read_html(r.content)[1]
        # 给表格所有行新增ID列,统一填充当前球员的ID
        player_df['ID'] = p
        df_list.append(player_df)
        print(f'球员ID{p}数据拉取成功')
    except Exception as e:
        print(f'球员ID{p}数据拉取失败:{e}')
        continue

# 合并所有球员表格得到最终带完整ID的总表
final_df = pd.concat(df_list, ignore_index=True)

可选方案

如果你需要保留原有的defaultdict存储逻辑,也可以修改为以下写法:

test = defaultdict(list)
for j,i in enumerate(datas['data'][0:2]):
    p = i.split("/")[-1]
    url = 'https://www.transfermarkt.co.uk/kylian-mbappe/leistungsdatendetails/spieler/{}'.format(p)
    r= requests.get(url, headers=headers)
    try:
        player_df = pd.read_html(r.content)[1]
        test[p].append(player_df)
        # 按当前表格行数追加对应数量的ID,保证长度匹配
        test['ID'].extend([p]*len(player_df))
        print('-------------------------------')
    except:
        continue

内容的提问来源于stack exchange,提问作者me.limes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:36:03