Устанавливать индекс нескольких столбцов в пандах

Я делаю dataframe следующим образом.

df = pd.DataFrame({ 'class' : ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'], 'number' : [1,2,3,4,5,1,2,3,4,5], 'math' : [90, 20, 50, 30, 57, 67, 89, 79, 45, 23], 'english' : [40, 21, 68, 89, 90, 87, 89, 54, 21, 23] }) 

и я хочу преобразовать индекс в это с помощью некоторых методов pandas (например, set_index, stack ,,,)

 df1 = pd.DataFrame(np.random.randint(1, 100, (5, 4)), columns = [['A', 'A', 'B', 'B'],['english', 'math', 'english', 'math']], index = [1, 2, 3, 4, 5]) 

Как я могу это сделать?

Я думаю, вам нужно set_index с unstack для перестройки, затем MultiIndex уровни в MultiIndex в столбцах с помощью swaplevel и последних столбцов сортировки sort_index :

 df1 = df.set_index(['number','class']).unstack().swaplevel(0,1,1).sort_index(1) print (df1) class AB english math english math number 1 40 90 87 67 2 21 20 89 89 3 68 50 54 79 4 89 30 21 45 5 90 57 23 23 

Другое решение с stack и unstack :

 print (df.set_index(['number','class']).stack().unstack([1,2])) class AB english math english math number 1 40 90 87 67 2 21 20 89 89 3 68 50 54 79 4 89 30 21 45 5 90 57 23 23 

Мне нравится @jezrael ответить много, но только для полноты – вы также можете использовать pandas.DataFrame.pivot_table вместо set_index + unstack :

 >>> df.pivot_table(index='number', columns='class').swaplevel(axis=1).sort_index(1) class AB english math english math number 1 40 90 87 67 2 21 20 89 89 3 68 50 54 79 4 89 30 21 45 5 90 57 23 23