2012-06-25 12 views
11

複数のインデックスが付いたDataFrameの名前を列レベルに添付しています。私は、彼らがユーザーが指定した順序に一致するように、周りの列を簡単にシャッフルすることができるようにしたいと思います。これはパイプラインがダウンしているので、私はthis recommended solutionを使用することができず、作成時にそれらを正しく注文することができません。特定のレベルで複数インデックスのデータフレーム列を並べ替える方法

私は['IWWGCW', 'IWWGDW', 'BASE']のようなリストに取ると、あることをこの順序を変更したい

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 

のように(何か)に見えるデータテーブルがあります:私ドンという警告で

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') 

を試してみましたが、それは動作していないようでした - それが正常に完了しましたが、返されたデータフレームはそのままその列の順序を持​​っていました。 reorder_columns(df, 'Experiment', ['IWWGCW', 'IWWGDW', 'BASE'])は、私が何を期待しますが、私は余分な作業をやっているようにそれは感じている

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 

私の問題を回避するには、のような機能を持つことです。これを行う簡単な方法はありますか?

答えて

4

私は何かを知りません。それについてエンハンスメント・チケットを作成:マルチインデックスのカラムの正しい順序で、単に元に基づいて新しいデータフレームを作成します:

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

+3

が、これは持っているようです – MERose

+0

これは構文です: 'df.reindex(['top'、 'mid'、 'btm']、level = 'first')' https://github.com/pandas-dev/pandas/pull/9019 –

7

は非常に単純な方法があります

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) 
+0

これは正解です。 – mrp

関連する問題