2017-10-19 147 views
1

我有例如像這樣列的數據框(如圖1爲任意值,以簡化這裏的東西:重排列的名稱和數量熊貓數據幀

  ID App R1 Pear R1 Oro R1 App R2 Pear R2 Oro R2 App R3 Pear R3 Oro R3 
0   1   1   1   1   1   1   1   1   1  1 
1   1   1   1   1   1   1   1   1   1  1 

我想重新安排這樣的列:

  ID App R1 App R2 App R3 Pear R1 Pear R2 Pear R3 Oro R1 Oro R2 Oro R3 
0   1   1   1   1   1   1   1   1   1  1 
1   1   1   1   1   1   1   1   1   1  1 

我曾嘗試:

df.columns = [['ID'] + ['App R{}'.format(r+1)] + ['Pear R{}'.format(r+1)] + ['Matched fragment ions R{}'.format(r+1)] + ['Oro R{}'.format(r+1)] for r in range(len(files))] 

注:應用程序,梨和奧羅的數r將取決於csv的號碼我開始

但是,迄今爲止沒有成功。

謝謝,如果你能幫我解決這個問題。

+0

是的,更好的視覺對比 – Flora

回答

3

使用自定義sorted與查找鍵

In [4291]: look = {'I':0, 'A':1, 'P':2, 'O':3} # order for letters 

In [4292]: sorted(df.columns, key=lambda x: look.get(x[0], '')) # first letter key 
Out[4292]: 
['ID', 
'App R1', 
'App R2', 
'App R3', 
'Pear R1', 
'Pear R2', 
'Pear R3', 
'Oro R1', 
'Oro R2', 
'Oro R3'] 

In [4293]: df[sorted(df.columns, key=lambda x: look.get(x[0], ''))] 
Out[4293]: 
    ID App R1 App R2 App R3 Pear R1 Pear R2 Pear R3 Oro R1 Oro R2 \ 
0 1  1  1  1  1  1  1  1  1 
1 1  1  1  1  1  1  1  1  1 

    Oro R3 
0  1 
1  1 
+0

我是如此接近這一個我使用前3個字母來創建字典,並失敗。這是超級 – Dark

+0

感謝您的回覆@零!使用它時我遇到一個小問題。我有三個最後一列(我沒有在我給出的例子中添加),它們有相同的第一個和第二個字母(例如Apr R1 R1 R2和Apr R3),我試圖把整個列名稱而不是第一個字母不幸的是,它像Bharath雪莉在他下面的評論中所說的那樣失敗了。你認爲你有另一種解決方案嗎?非常感謝 – Flora

+0

然後在更新'look'後使用3個字符,例如'look.get(x [:3],'')'0123'''''' – Zero

1

我覺得MultiIndex應該有所幫助:

#set all not R columns to index 
df = df.set_index(['ID']) 
#create multiindex 
df.columns = df.columns.str.split(expand=True) 
#custom reordering 
df = df.reindex(columns=['App','Pear','Oro'], level=0) 
print (df) 
    App  Pear  Oro  
    R1 R2 R3 R1 R2 R3 R1 R2 R3 
ID        
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 

df.columns = df.columns.map(' '.join) 
print (df) 
    App R1 App R2 App R3 Pear R1 Pear R2 Pear R3 Oro R1 Oro R2 Oro R3 
ID                   
1  1  1  1  1  1  1  1  1  1 
1  1  1  1  1  1  1  1  1  1 
+0

感謝您的幫助。我已經爲我的代碼嘗試了它,但只適用於'應用'而不是另一個。 「NaN在R1之後和價值之前是否正常? – Flora

+0

我無法模擬它 – jezrael

+0

但基本上它取決於你的需要。 MultiIndex可以幫助某些操作,例如如果需要與所有的「Oro」柱一起工作,例如一些arithemtic操作。如果不是,更好使用另一個零答案。 – jezrael