Как я могу преобразовать уровень индекса в новый уровень в многоуровневом столбце (Pandas)

#python #pandas #multi-index

#python #pandas #многоиндексный

Вопрос:

У меня есть следующий фрейм данных dfg (который является результатом предыдущих агрегаций).

                    F-1   F-2
dataset Model               
G       Baseline 0.971 0.967
        Version2 0.971 0.967
H       Baseline 0.780 0.762
        Version2 0.800 0.777
S       Baseline 0.401 0.320
        Version2 0.453 0.365
T       Baseline 0.881 0.825
        Version2 0.989 0.985
 

Я хочу получить следующую организацию моего фрейма данных:

         Baseline    Version2
dataset F-1   F-2   F-1   F-2
G       0.971 0.967 0.971 0.967
H       0.780 0.762 0.800 0.777
S       0.401 0.320 0.453 0.365
T       0.881 0.825 0.989 0.985
 

Я попробовал несколько вещей, но то, что я считал лучшими решениями, всегда давало мне ошибки. Мое самое «логичное» решение было:

  • сбросьте индекс (чтобы извлечь «модель» в столбцы);
  • создайте многоуровневый столбец из кортежей;
  • превращение столбцов в многоуровневые столбцы.

вот так:

 dfg.reset_index(inplace=True, level=['Model']
new_cols = [('Baseline', 'F-1'), ('Baseline', 'F-2'), ('Version2', 'F-1'), ('Version2', 'F-2')]
multi_cols = pd.MultiIndex.from_tuples(new_cols, names=('Model', 'Measure'))
 

но я получаю следующие ошибки:

 ValueError: Length mismatch: Expected axis has 3 elements, new values have 4 elements
 

Я знаю, что это довольно сыро, но я не могу найти ни одного источника, который мог бы объяснить, как создавать многоуровневые столбцы из существующих фреймов данных.

Ответ №1:

Используйте DataFrame.stack с Series.unstack , последние чистые имена столбцов по DataFrame.rename_axis :

 #last previous, last levels
df = df.stack().unstack([-2,-1]).rename_axis((None, None), axis=1)
#or second and third levels
#df = df.stack().unstack([1,2]).rename_axis((None, None), axis=1)
print (df)
        Baseline        Version2       
             F-1    F-2      F-1    F-2
dataset                                
G          0.971  0.967    0.971  0.967
H          0.780  0.762    0.800  0.777
S          0.401  0.320    0.453  0.365
T          0.881  0.825    0.989  0.985
 

Комментарии:

1. Спасибо! И как я мог «стереть» «Модель»?

2. @MrT77 — Ответ был отредактирован.

Ответ №2:

 df.stack().unstack(0).transpose()