Python Pivot使用数字和文本字段的混合数据框
我有这个数据框Python Pivot使用数字和文本字段的混合数据框,python,pandas,Python,Pandas,我有这个数据框 Athlete Race Distance Rank Time M.Smith A 400m. 1 48.57 A.Moyet A 400m. 2 49.00 C.Marconi B 800m 5 104.12 M.Smith B 800m. 3 102.66 想把它变成 Athlete Race#1 Distance#1 Rank#1 Time#1
Athlete Race Distance Rank Time
M.Smith A 400m. 1 48.57
A.Moyet A 400m. 2 49.00
C.Marconi B 800m 5 104.12
M.Smith B 800m. 3 102.66
想把它变成
Athlete Race#1 Distance#1 Rank#1 Time#1 Race#2 Distance#2 Rank#2 Time#2
M.Smith A 400m 1 48.57 B 800m 3 102.66
A.Moyet A 400m 2 49.00 NaN NaN NaN NaN
C.Marconi B 800m 5 104.12 NaN NaN NaN NaN
谢谢你的回答 诀窍是根据每一行是否应该与种族1或种族2关联,为每一行分配一个种族编号(例如1或2): 然后,所需的数据帧可以表示为
set\u index/unstack
操作的结果:
result = df.set_index(['Athlete', 'race']).unstack('race')
# Distance Race Rank Time
# race 1 2 1 2 1 2 1 2
# Athlete
# A.Moyet 400m NaN A NaN 2 NaN 49.00 NaN
# C.Marconi 800m NaN B NaN 5 NaN 104.12 NaN
# M.Smith 400m 800m A B 1 3 48.57 102.66
set\u index
将atternate
和race
列移动到索引中。unstack
操作将race
索引级别移动到列级别
再加上一些润色,以获得所需格式的列:
import pandas as pd
df = pd.DataFrame({'Athlete': ['M.Smith', 'A.Moyet', 'C.Marconi', 'M.Smith'],
'Distance': ['400m', '400m', '800m', '800m'],
'Race': ['A', 'A', 'B', 'B'],
'Rank': [1, 2, 5, 3],
'Time': [48.57, 49.0, 104.12, 102.66]})
df['race'] = df.groupby('Athlete').cumcount()+1
result = df.set_index(['Athlete', 'race']).unstack('race')
result = result.sortlevel('race', axis='columns')
result.columns = ['{}#{}'.format(col, n) for col, n in result.columns]
print(result)
屈服
Distance#1 Race#1 Rank#1 Time#1 Distance#2 Race#2 Rank#2 Time#2
Athlete
A.Moyet 400m A 2 49.00 NaN NaN NaN NaN
C.Marconi 800m B 5 104.12 NaN NaN NaN NaN
M.Smith 400m A 1 48.57 800m B 3 102.66
我尝试了df.pivot_table(),但我相信它只适用于数字字段。这里我混合了文本和数字,它们与种族有关。我可以使用MySQL的自动增量功能将竞争计数作为一个单独的列在pandas中进行透视,但这并不能解决整个问题。也在寻找一个熊猫唯一的解决方案。请将您的代码添加到您的答案中,以解决这个非平凡的问题…+1
Distance#1 Race#1 Rank#1 Time#1 Distance#2 Race#2 Rank#2 Time#2
Athlete
A.Moyet 400m A 2 49.00 NaN NaN NaN NaN
C.Marconi 800m B 5 104.12 NaN NaN NaN NaN
M.Smith 400m A 1 48.57 800m B 3 102.66