如何将横向存储的英超联赛数据转换为纵向结构化DataFrame?
解决方法
你的核心问题是把宽表(每行一个赛季,列是所有球队的各项数据)转成长表(每行对应一个赛季+一支球队,列是各项赛事指标),转置没用是因为仅互换行列无法拆分球队和指标的维度。以下是具体操作步骤:
假设你的DataFrame初始结构
假设你的df是这样的(每行对应一个赛季,列采用球队_指标命名格式):
| 阿森纳_积分 | 阿森纳_胜场 | ... | 曼城_积分 | 曼城_胜场 | ... | |
|---|---|---|---|---|---|---|
| 2021/22 | 88 | 26 | ... | 93 | 29 | ... |
| 2022/23 | 89 | 26 | ... | 89 | 28 | ... |
| 2023/24 | 84 | 25 | ... | 89 | 28 | ... |
步骤1:将赛季转为独立列
先把行索引中的赛季转为普通数据列:
import pandas as pd # 假设爬取的数据已存入DataFrame df df = df.reset_index().rename(columns={'index': '赛季'})
步骤2:宽表转长表
用melt方法把所有球队指标列拆分为球队_指标和数据两列:
melted_df = df.melt(id_vars='赛季', var_name='球队_指标', value_name='数据')
步骤3:拆分球队与指标
将球队_指标列拆分为球队和指标两个独立列:
# 这里假设列名用下划线分隔,若使用空格等其他分隔符,替换成对应字符即可 melted_df[['球队', '指标']] = melted_df['球队_指标'].str.split('_', expand=True)
步骤4:重塑为纵向积分榜格式
用pivot_table把指标转为列,得到和官方一致的纵向结构:
final_df = melted_df.pivot_table( index=['赛季', '球队'], columns='指标', values='数据', aggfunc='first' ).reset_index() # 可选:按英超官方指标顺序调整列的排列 desired_cols = ['赛季', '球队', '积分', '胜场', '平场', '负场', '进球', '失球', '净胜球', '排名'] final_df = final_df[desired_cols]
特殊情况处理:列名无球队/标识
如果你的列名没有明确的球队_指标格式(比如仅为col0, col1...),先手动给列名打上球队和指标标签:
# 定义20支英超球队列表(需和爬取的列顺序严格对应) teams = ['阿森纳', '曼城', '利物浦', '切尔西', '热刺', '曼联', '纽卡斯尔', '布莱顿', '阿斯顿维拉', '布伦特福德', '富勒姆', '水晶宫', '埃弗顿', '伯恩茅斯', '狼队', '西汉姆联', '诺丁汉森林', '南安普顿', '莱斯特城', '利兹联'] # 定义指标列表(每个球队对应的指标顺序) stats = ['积分', '胜场', '平场', '负场', '进球', '失球', '净胜球', '排名'] # 生成新的列名 new_columns = [f'{team}_{stat}' for team in teams for stat in stats] df.columns = new_columns # 之后再执行上述步骤1-4即可
处理完成后,final_df就是每行对应一个赛季的一支球队、各项指标为列的纵向格式,完全匹配英超官方积分榜的结构。
内容的提问来源于stack exchange,提问作者Jing Yu
相关产品推荐
相关产品推荐

