
本文介绍如何将多赛季英超积分榜的横向嵌套列表(每季一行、列数极多)高效重塑为规范的纵向dataframe,涵盖数据拆分、字段解析与结构重组全流程。
本文介绍如何将多赛季英超积分榜的横向嵌套列表(每季一行、列数极多)高效重塑为规范的纵向dataframe,涵盖数据拆分、字段解析与结构重组全流程。
在使用 Selenium 爬取多个赛季的英超联赛积分榜时,常见结果是将每个赛季所有球队数据“铺平”为单行——例如 20 支球队 × 每队 8 个字段 = 160 列,3 个赛季则生成 3 行 × 160 列的宽表。这种结构不利于分析与可视化,必须转换为标准的长格式:每行代表一支球队在一个赛季中的完整记录(共 60 行,对应 3 季 × 20 队),列包括 Position、Club、Played、Won、Draw、Lost、GF、GA、GD、Points 和 Form。
核心思路是:先展平嵌套列表 → 按每支队伍 8 字段切分 → 解析复合字段 → 合并重构列名。以下是推荐的 Pandas 实现方案(兼容 Python ≥ 3.12):
from itertools import chain, batched
import pandas as pd
# 假设 table_data 是原始嵌套列表(3 个赛季,每季含 20 支队)
df = (
pd.DataFrame(batched(chain.from_iterable(table_data), 8))
.pipe(
lambda raw: pd.concat(
[
raw.iloc[:, :2], # 第1列:排名;第2列:俱乐部名
raw[2].str.split(expand=True).astype(int), # 第3列:'33 23 5 5 77 26 51 74' → 拆为8整数列
raw.iloc[:, 3:].agg(" ".join, axis=1), # 第4–8列:连续5个赛果(W/L/D)合并为单字符串
],
axis=1,
)
)
.set_axis(
[
"Position", "Club", "Played",
"Won", "Draw", "Lost", "GF", "GA", "GD",
"Points", "Form"
],
axis=1
)
)
✅ 关键说明:
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac下载让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- chain.from_iterable(table_data) 将 [[season1], [season2], [season3]] 扁平化为单一长列表;
- batched(..., 8) 每 8 个元素一组(对应每队的 Rank, Club, StatsStr, Last5Result×5);
- raw[2].str.split(expand=True).astype(int) 精准解析如 '33 23 5 5 77 26 51 74' 为 8 列数值(顺序:场次、胜、平、负、进球、失球、净胜球、积分);
- raw.iloc[:, 3:].agg(" ".join, axis=1) 将后续 5 列赛果(如 ['W','W','D','L','W'])合并为 "W W D L W",便于后续分析或编码。
⚠️ 注意事项:
- 若需区分赛季来源(如添加 Season 列),建议在 batched 后引入周期标识,例如通过 itertools.zip_longest 或手动构造 season ID 数组后 pd.concat(..., keys=season_ids);
- 若使用 Python
- 实际数据中可能存在空值或异常格式(如 — 替代数字),应在 .astype(int) 前用 .replace("—", pd.NA) 并指定 errors='coerce' 提升鲁棒性;
- 最终 DataFrame 可直接用于绘图(如 sns.barplot(df, x='Club', y='Points'))或时间序列对比(需额外添加 Season 字段)。
经此转换,原始 3×160 的宽表将变为结构清晰、语义明确的 60×11 标准长表,完全适配后续统计建模、动态排名分析及可视化需求。











