У меня есть мультииндексированный DataFrame
с именами, прикрепленными к уровням столбцов. Я хотел бы иметь возможность легко перемешать столбцы вокруг так, чтобы они соответствовали порядку, указанному пользователем. Поскольку это не работает, я не могу использовать это рекомендуемое решение и упорядочить их правильно во время создания.
У меня есть таблица данных, которая выглядит (что-то) вроде
Experiment BASE IWWGCW IWWGDW
Lead Time 24 48 24 48 24 48
2010-11-27 12:00:00 0.997 0.991 0.998 0.990 0.998 0.990
2010-11-28 12:00:00 0.998 0.987 0.997 0.990 0.997 0.990
2010-11-29 12:00:00 0.997 0.992 0.997 0.992 0.997 0.992
2010-11-30 12:00:00 0.997 0.987 0.997 0.987 0.997 0.987
2010-12-01 12:00:00 0.996 0.986 0.996 0.986 0.996 0.986
Я хочу взять список как ['IWWGCW', 'IWWGDW', 'BASE']
и изменить его следующим образом:
Experiment IWWGCW IWWGDW BASE
Lead Time 24 48 24 48 24 48
2010-11-27 12:00:00 0.998 0.990 0.998 0.990 0.997 0.991
2010-11-28 12:00:00 0.997 0.990 0.997 0.990 0.998 0.987
2010-11-29 12:00:00 0.997 0.992 0.997 0.992 0.997 0.992
2010-11-30 12:00:00 0.997 0.987 0.997 0.987 0.997 0.987
2010-12-01 12:00:00 0.996 0.986 0.996 0.986 0.996 0.986
с оговоркой, что я не всегда знаю, на каком уровне будет "Эксперимент". Я попробовал (где df
- многоиндексированный кадр, показанный выше)
df2 = df.reindex_axis(['IWWGCW', 'IWWGDW', 'BASE'], axis=1, level='Experiment')
но это не сработало - оно успешно завершено, но возвращаемый DataFrame не изменил порядок столбцов.
Мое обходное решение состоит в том, чтобы иметь такую функцию, как:
def reorder_columns(frame, column_name, new_order):
"""Shuffle the specified columns of the frame to match new_order."""
index_level = frame.columns.names.index(column_name)
new_position = lambda t: new_order.index(t[index_level])
new_index = sorted(frame.columns, key=new_position)
new_frame = frame.reindex_axis(new_index, axis=1)
return new_frame
где reorder_columns(df, 'Experiment', ['IWWGCW', 'IWWGDW', 'BASE'])
делает то, что я ожидаю, но мне кажется, что я делаю дополнительную работу. Есть ли более простой способ сделать это?