Как изменить порядок столбцов мультииндексированных фреймов данных на определенном уровне

У меня есть мультииндексированный 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'])делает то, что я ожидаю, но это такое ощущение, что я делаю лишнюю работу. Есть ли более простой способ сделать это?

21
задан Tim Whitcomb 6 January 2017 в 22:19
поделиться