如何在Python数据框中仅透视特定列
我正在尝试创建一个流程,上传一些可编辑的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