31

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'])れますが、私は余分な仕事をしているように感じます。これを行う簡単な方法はありますか?

4

5 に答える 5

30

非常に簡単な方法があります。元のデータフレームに基づいて、マルチインデックス列の正しい順序で新しいデータフレームを作成するだけです。

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)
于 2016-02-05T09:29:44.723 に答える
8

手に負えないことは何も知りません。それについての拡張チケットを作成しました:

http://github.com/pydata/pandas/issues/1864

于 2012-09-08T22:59:04.880 に答える