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
相关产品推荐
相关产品推荐

