如何在特定级别重新排序多索引数据框列

新手上路,请多包涵

我有一个多索引 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']) 符合我的预期,但感觉我在做额外的工作。有没有更简单的方法来做到这一点?

原文由 Tim Whitcomb 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 365
2 个回答

我上面评论的解决方案,使用 pandas 1.3.2:

 df.reindex(columns=['IWWGCW', 'IWWGDW', 'BASE'], level='Experiment')

原文由 Irv 发布,翻译遵循 CC BY-SA 4.0 许可协议

有一个非常简单的方法:只需基于原始数据框创建一个新的数据框,并使用正确的多索引列顺序:

 multi_tuples = [('IWWGCW',24), ('IWWGCW',48), ('IWWGDW',24), ('IWWGDW',48)
    , ('BASE',24), ('BASE',48)]

multi_cols = pd.MultiIndex.from_tuples(multi_tuples, names=['Experiment', 'Lead Time'])

df_ordered_multi_cols = pd.DataFrame(df_ori, columns=multi_cols)

原文由 ragesz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题