Tenho um dataframe Pandas que registra o desempenho dos alunos em exames de diferentes turmas e ele se parece com:
Class_ID Class_size Student_Number IQ Hours Score Place
1 3 1 101 10 98 1
1 3 2 99 19 80 3
1 3 3 130 3 95 2
2 5 1 93 5 50 5
2 5 2 103 9 88 3
2 5 3 112 12 99 2
2 5 4 200 10 100 1
2 5 5 90 19 78 4
3 2 1 100 12 84 2
3 2 2 102 13 88 1
e eu gostaria de converter o formato longo acima em formato largo, usando Student_Number
as columns
e Class_ID, Class_size
as index
, com a última coluna Top
sendo o aluno que chega primeiro naquela classe, então o resultado desejado se parece com:
Class_ID Class_size IQ_1 IQ_2 IQ_3 IQ_4 IQ_5 Hours_1 Hours_2 Hours_3 Hours_4 Hours_5 Score_1 Score_2 Score_3 Score_4 Score_5 Top
1 1 101 99 130 NaN NaN 10 19 3 NaN NaN 98 80 95 NaN NaN 1
2 5 93 103 112 200 90 5 9 12 10 19 50 88 99 100 78 4
3 2 100 102 NaN NaN NaN 12 13 NaN NaN NaN 84 88 NaN NaN NaN 2
E aqui está o que eu tentei:
out = df.pivot_table(index=['Class_ID', 'Class_size'],
columns='Student_Number',
values=['IQ', 'Hours', 'Score'])
out.columns = [f'{x}_{y}' for x,y in out.columns]
out_dummy = out.reset_index()
df_wide = out_dummy
No entanto, não tenho ideia de como criar a última coluna Top
. E também, o código acima parece ser bem lento, e como meu dataframe original é bem grande (~300.000 linhas), gostaria de perguntar se há alguma maneira mais rápida de fazer isso também. Muito obrigado antecipadamente.