如何在Python数据框中仅透视特定列

1 投票
1 回答
45 浏览
提问于 2025-04-12 03:52

我正在尝试创建一个流程,上传一些可编辑的PDF文件,解析这些PDF中的数据,然后把数据整理到一个数据框(df)里。我已经成功地读取了可编辑PDF中的数据,并将其放入了数据框,但我遇到了一个问题:每个球员的名字在数据框中显示为列,而不是每个球员对应一行。目前,每个球员的行显示为 name_#、position_#、country_# 等等。

这里的数据并不是我实际使用的,只是为了重现我遇到的情况。

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"]})
球队 地区 联赛 名字_1 位置_1 国家_1 名字_2 位置_2 国家_2
0 拜仁 巴伐利亚 德甲 罗本 右边锋 荷兰 里贝里 左边锋 法国
1 巴萨 巴萨 西甲 梅西 前锋 阿根廷 内马尔 左边锋 巴西
2 皇马 马德里 欧冠 C罗 前锋 葡萄牙 本泽马 右边锋 法国

我正在寻找一种方法来重新排列这个数据框,使它看起来像下面分享的这个数据框:每个球队对应一个不同的PDF,但结构都是一样的。

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", "ST", "RW", "LW"],
    'Country': ["Netherlands", "Argentina", "Portugal", "Brazil", "France", "France"]})
球队 地区 联赛 名字 位置 国家
0 拜仁 巴伐利亚 德甲 罗本 右边锋 荷兰
1 巴萨 巴萨 西甲 梅西 前锋 阿根廷
2 皇马 马德里 欧冠 C罗 前锋 葡萄牙
3 巴萨 巴萨 西甲 内马尔 前锋 巴西
4 皇马 马德里 欧冠 本泽马 右边锋 法国
5 拜仁 巴伐利亚 德甲 里贝里 左边锋 法国

1 个回答

1

这正是 wide_to_long() 这个函数的用途。

pd.wide_to_long(
    df,
    ['name', 'Position', 'Country'],
    i='Team',
    j='n',
    sep='_',
)
                region             title     name Position      Country
Team      n
Bayern    1   Bravaria        Bundesliga   Robben       RW  Netherlands
Barcelona 1  Barcelona            Laliga    Messi       ST    Argentina
Madrid    1     Madrid  Champions Leauge  Ronaldo       ST     Portugal
Bayern    2   Bravaria        Bundesliga   Ribery       LW       FRANCE
Barcelona 2  Barcelona            Laliga   Neymar       LW       Brazil
Madrid    2     Madrid  Champions Leauge  Benzema       RW       France

撰写回答