Я предполагаю, что ваш исходный CSV-файл выглядит следующим образом:
,Group_1,Group_2
,Sub_Group_1,Sub_Group_1
Maturity,7/31/20,7/31/20
0.1,0.2,0.3
0.2,0.3,0.4
Обратите внимание, что:
- есть начальные пробелы в первых 2 строках ( имена 2 верхних уровней MultiIndex для первого столбца), иначе read_csv даст им Безымянный ... имена по умолчанию,
- на самом деле есть 3 Уровни MultiIndex в столбцах (третий уровень содержит даты).
Я прочитал их, позвонив по номеру df = pd.read_csv('Input.csv', header=[0,1,2])
, а содержимое:
Group_1 Group_2
Sub_Group_1 Sub_Group_1
Maturity 7/31/20 7/31/20
0 0.1 0.2 0.3
1 0.2 0.3 0.4
(вы должны были включить его вместо изображения).
Первый шаг: расплавить :
result = pd.melt(df, id_vars=[(' ', ' ', 'Maturity')],
var_name=['Group_Name', 'Sub_Group_Name', 'Date'])
Обратите внимание, что в приведенном выше коде я указал id_vars как кортеж , с двумя верхними элементами в качестве пробелов (вот почему я сделал предположение о начальных пробелах).
Результат:
( , , Maturity) Group_Name Sub_Group_Name Date value
0 0.1 Group_1 Sub_Group_1 7/31/20 0.2
1 0.2 Group_1 Sub_Group_1 7/31/20 0.3
2 0.1 Group_2 Sub_Group_1 7/31/20 0.3
3 0.2 Group_2 Sub_Group_1 7/31/20 0.4
И единственное нужно переименовать первый столбец:
result.rename(columns={result.columns[0]: 'Maturity'}, inplace=True)
Теперь, когда вы распечатываете результат, вы получите:
Maturity Group_Name Sub_Group_Name Date value
0 0.1 Group_1 Sub_Group_1 7/31/20 0.2
1 0.2 Group_1 Sub_Group_1 7/31/20 0.3
2 0.1 Group_2 Sub_Group_1 7/31/20 0.3
3 0.2 Group_2 Sub_Group_1 7/31/20 0.4
Порядок строк немного отличается erent, но так работает расплав . Если вас не устраивает эта деталь, измените порядок строк в соответствии с вашими потребностями.