2012-06-25 11 views
11

Sütun düzeylerine eklenmiş, çok indeksli bir DataFrame elimde var. Kullanıcıların belirttikleri sırayla eşleşmeleri için sütunları kolayca karıştırmak isterim. Bu, boru hattından aşağı doğru olduğundan, this recommended solution'u kullanamıyorum ve bunları oluşturma zamanında düzgün bir şekilde sipariş edemiyorum.Çoklu dizinli veri çerçevesi sütunlarını belirli bir düzeyde nasıl yeniden düzenleyebilirim?

Olmam ['IWWGCW', 'IWWGDW', 'BASE'] gibi bir listede alıp bu yeniden sıralamak istiyorum

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 

gibi (bir şey) görünen bir veri tablosu vardır: uyarı bununla

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 

ı don Herzaman hangi seviyede olduğunu bilirsiniz "Deneme". Denedim

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

(df yukarıda gösterilen çoklu endeksli çerçeve olduğu) ama bu işe görünmüyordu - bu başarıyla tamamlandı, ancak iade edildi DataFrame onun sütun sırası değişmeden kaldı.

Benim geçici çözüm gibi bir işlevi sahip olmaktır:

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']) beklediğim ama ekstra çalışma yapıyor gibi hissediyor onu yapar nerede. Bunu yapmanın daha kolay bir yolu var mı?

cevap

4

Elimden hiçbir şey bilmiyorum. Bu konuda bir iyileştirme bilet oluşturuldu: multiindex sütunların doğru sırayla ile, sadece orijinal dayalı yeni dataframe oluşturmak:

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

+3

bu vardır görünüyor https://github.com/pydata/pandas/issues/4088 – MERose

+0

ile çözüldü. Bu sözdizimi: df.reindex (['üst', 'orta', 'btm'], seviye = 'ilk') ' https://github.com/pandas-dev/pandas/pull/9019 –

7

çok basit bir yolu yoktur

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

Doğru cevap budur. – mrp

İlgili konular