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