2012-06-25 3 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 

을 나는 돈 '실험'수준은 언제나 알 수 없습니다. 나는 시도

df2 = df.reindex_axis(['IWWGCW', 'IWWGDW', 'BASE'], axis=1, level='Experiment') 

(df은 위의 멀티 인덱스 프레임입니다)하지만이 작동하지 않았다 - 성공적으로 완료 되었으나, 반환 된 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

나는 어떤 것도 알지 못합니다. 그것에 대해 향상 티켓을 만든 : multiindex 열 올바른 순서로, 단지 원래 기반으로 새 dataframe를 만들 :

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

+3

이는 것 같다 https://github.com/pydata/pandas/issues/4088로 해결되었습니다 – 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

관련 문제