Я полагаю, что это то, что вы хотите.
Я предполагаю, что ваш "x" находится в ваших строках, а "y" - в ваших столбцах, и что вы хотите MultiIndex с ["ts", "x", "y"]:
(df
.rename_axis('x').reset_index()
.set_index(['ts', 'x'])
.rename_axis('y', axis=1).stack()
.rename('value')
)
Разбить его:
rename_axis('x').reset_index()
: переименовать текущий индекс в «x» и превратить его в обычный столбец (что потребуется для следующего шага.) set_index(['ts', 'x'])
: установите индекс как MultiIndex с ["ts", "x"]. Это очень похоже на оригинальный DataFrame, только с "ts", перемещенным в индекс. rename_axis('y', axis=1)
: Назовите ось столбца как "y". stack()
: поверните столбцы в строки, добавляя третий компонент в MultiIndex. Получившаяся серия должна иметь желаемую форму. rename('value')
: переименуйте серию как «значение», в случае, если вы вернете ее обратно в DataFrame с to_frame()
, именем которого будет столбец.