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

如何在Python DataFrame中对指定列透视重塑,规整球员数据结构?

问题描述

我正在搭建一个流程:上传可编辑PDF并解析数据,将其整理为DataFrame。目前已完成PDF数据读取并导入DataFrame,但遇到问题:球员信息以name_#、Position_#、Country_#等列形式存在,而非每行对应一个球员。

模拟数据如下:

import pandas as pd

df = pd.DataFrame({
    'Team': ["Bayern", "Barcelona", "Madrid"],
    'region': ["Bravaria", "Barcelona", "Madrid"],
    'title': ["Bundesliga", "Laliga", "Champions Leauge"],
    'name_1': ["Robben", "Messi", "Ronaldo"],
    'Position_1': ["RW", "ST", "ST"],
    'Country_1': ["Netherlands", "Argentina", "Portugal"],
    'name_2': ["Ribery", "Neymar", "Benzema"],
    'Position_2': ["LW", "LW", "RW"],
    'Country_2': ["FRANCE", "Brazil", "France"]})

原始DataFrame结构:

Teamregiontitlename_1Position_1Country_1name_2Position_2Country_2
0BayernBravariaBundesligaRobbenRWNetherlandsRiberyLWFRANCE
1BarcelonaBarcelonaLaligaMessiSTArgentinaNeymarLWBrazil
2MadridMadridChampions LeaugeRonaldoSTPortugalBenzemaRWFrance

需要将该DataFrame重塑为每行对应一个球员的结构,目标结构如下:

df1 = pd.DataFrame({
    'Team': ["Bayern", "Barcelona", "Madrid", "Barcelona", "Madrid", "Bayern"],
    'region': ["Bravaria", "Barcelona", "Madrid", "Barcelona", "Madrid", "Bravaria"],
    'title': ["Bundesliga", "Laliga", "Champions Leauge", "Laliga", "Champions Leauge", "Bundesliga"],
    'name': ["Robben", "Messi", "Ronaldo", "Neymar", "Benzema", "Ribery"],
    'Position': ["RW", "ST", "ST", "LW", "RW", "LW"],
    'Country': ["Netherlands", "Argentina", "Portugal", "Brazil", "France", "FRANCE"]})

目标DataFrame结构:

TeamregiontitlenamePositionCountry
0BayernBravariaBundesligaRobbenRWNetherlands
1BarcelonaBarcelonaLaligaMessiSTArgentina
2MadridMadridChampions LeaugeRonaldoSTPortugal
3BarcelonaBarcelonaLaligaNeymarLWBrazil
4MadridMadridChampions LeaugeBenzemaRWFrance
5BayernBravariaBundesligaRiberyLWFRANCE
解决方案

使用pandas的wide_to_long方法可直接处理这种带数字后缀的宽表转长表,一步完成重塑:

# 转置数据
result = pd.wide_to_long(df, 
                         stubnames=['name', 'Position', 'Country'], 
                         i=['Team', 'region', 'title'], 
                         j='player_num',
                         sep='_',
                         suffix='\\d+')

# 重置索引,将索引列转为普通列
result = result.reset_index(drop=False)

# 若不需要球员编号列,可删除
result = result.drop('player_num', axis=1)

参数说明

  • stubnames:指定需要转置的列前缀(name、Position、Country)
  • i:指定保持不变的标识列(球队相关信息)
  • j:后缀数字对应的新列名(此处为球员编号,可按需删除)
  • sep:列名中前缀与后缀的分隔符(这里是_)
  • suffix:匹配后缀的正则表达式,\\d+表示匹配一个或多个数字

若使用melt方法需要多步处理,wide_to_long更适配此类带规则后缀的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 02:59:55