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

Python足球数据处理:筛选各联赛连续4赛季留存球队

解决方案

要实现每个联赛只保留打满全部4个赛季的球队记录,按以下步骤操作:

先修正数据读取逻辑(关键补全赛季标识)

原代码合并后的数据没标记每行所属赛季,没法统计球队参赛次数,先补上这一步:

import pandas as pd
import numpy as np

leagues = ["E0", "E1", "E2", "E3", "EC"]
seasons = ["2223", "2122", "2021", "1920"]
baseUrl = "https://www.football-data.co.uk/mmz4281/"

column_names = ["Div", "HomeTeam", "AwayTeam", "FTHG", "FTAG", "FTR"]

dfs = []
for league in leagues:
    for season in seasons:
        url = f"{baseUrl}{season}/{league}.csv"
        temp_df = pd.read_csv(url, encoding='cp1252', usecols=column_names)
        temp_df['Season'] = season  # 给每行加上赛季标记
        dfs.append(temp_df)
df = pd.concat(dfs, ignore_index=True)

统计每个联赛中各球队的参赛赛季数

把主客场球队的数据整合,统计每个球队在对应联赛里打了多少个不同赛季:

# 提取主场球队的联赛、球队、赛季信息,统一列名
home_records = df[['Div', 'HomeTeam', 'Season']].rename(columns={'HomeTeam': 'Team'})
# 提取客场球队的对应信息
away_records = df[['Div', 'AwayTeam', 'Season']].rename(columns={'AwayTeam': 'Team'})
# 合并主客场数据
all_team_seasons = pd.concat([home_records, away_records], ignore_index=True)

# 去重,避免同一赛季同一球队多次计数
unique_team_seasons = all_team_seasons.drop_duplicates(subset=['Div', 'Team', 'Season'])

# 统计每个联赛-球队组合的参赛赛季数
team_season_count = unique_team_seasons.groupby(['Div', 'Team']).size().reset_index(name='SeasonCount')

筛选符合条件的球队

挑出每个联赛里赛季数等于4的球队(也就是打满全部赛季的):

valid_teams = team_season_count[team_season_count['SeasonCount'] == len(seasons)]

过滤出干净数据

最后过滤原始数据,只保留这些有效球队的所有记录:

# 筛选主场是有效球队的记录
valid_home = df.merge(valid_teams, left_on=['Div', 'HomeTeam'], right_on=['Div', 'Team'], how='inner')
# 筛选客场是有效球队的记录
valid_away = df.merge(valid_teams, left_on=['Div', 'AwayTeam'], right_on=['Div', 'Team'], how='inner')
# 合并后去重,避免同一行被重复保留
clean_df = pd.concat([valid_home, valid_away], ignore_index=True).drop_duplicates(subset=['Div', 'Season', 'HomeTeam', 'AwayTeam'])

# 删除合并产生的冗余列
clean_df = clean_df.drop(columns=['Team', 'SeasonCount'])

验证结果

可以用下面的代码确认是否正确:

# 检查每个球队的参赛赛季数,正常应该没有不等于4的情况
check = clean_df.groupby(['Div', 'HomeTeam'])['Season'].nunique().reset_index()
print(check[check['Season'] != 4])  # 正常输出空DataFrame

处理后的clean_df就是你要的结果——每个联赛里只保留了全程参赛的球队记录,升降级球队的所有相关行都被移除了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 08:20:29