#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()