如何在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结构:
| Team | region | title | name_1 | Position_1 | Country_1 | name_2 | Position_2 | Country_2 | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | Bayern | Bravaria | Bundesliga | Robben | RW | Netherlands | Ribery | LW | FRANCE |
| 1 | Barcelona | Barcelona | Laliga | Messi | ST | Argentina | Neymar | LW | Brazil |
| 2 | Madrid | Madrid | Champions Leauge | Ronaldo | ST | Portugal | Benzema | RW | France |
需要将该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结构:
| Team | region | title | name | Position | Country | |
|---|---|---|---|---|---|---|
| 0 | Bayern | Bravaria | Bundesliga | Robben | RW | Netherlands |
| 1 | Barcelona | Barcelona | Laliga | Messi | ST | Argentina |
| 2 | Madrid | Madrid | Champions Leauge | Ronaldo | ST | Portugal |
| 3 | Barcelona | Barcelona | Laliga | Neymar | LW | Brazil |
| 4 | Madrid | Madrid | Champions Leauge | Benzema | RW | France |
| 5 | Bayern | Bravaria | Bundesliga | Ribery | LW | FRANCE |
解决方案
使用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
相关产品推荐
相关产品推荐

