2017-08-10 132 views
1

在許多threads之前已經詢問過在熊貓中重新排列色譜柱。使用列號重新排列色譜柱 - Pythonic方式

我可以print我的專欄和複製粘貼任何我需要重新排列在pandas。但是,我想知道如果我有超過20列,我可以使用列數重新排列嗎?我知道在R這是可以做到這樣的事情,

new_df <- my_df[,c(1:9, 11:21, 10)] 

我試圖下同在pandas,但得到一個SyntaxError

new_df = my_df[[:, 1:9, 11:21, 10]] 

我一直在尋找,但沒有找到一個文件請參閱獲取答案。有沒有像pandas那樣的東西,我可以像R那樣在一行中做到這一點?

回答

2

我認爲你需要numpy.r_爲concanecate指數:

new_df = my_df.iloc[:, np.r_[1:9, 11:21, 10]] 

樣品:

np.random.seed(100) 
my_df = pd.DataFrame(np.random.randint(10, size=(3,30))) 

new_df = my_df.iloc[:, np.r_[1:9, 11:21, 10]] 
print (new_df) 
    1 2 3 4 5 6 7 8 11 12 13 14 15 16 17 18 19 20 10 
0 8 3 7 7 0 4 2 5 2 1 0 8 4 0 9 6 2 4 2 
1 7 0 2 9 9 3 2 5 0 7 6 2 0 8 2 5 1 8 1 
2 6 3 4 7 6 3 9 0 5 7 6 6 2 4 2 7 1 6 4 

new_df = my_df.iloc[:, np.r_[1:10, 11:22, 10]] 
print (new_df) 
    1 2 3 4 5 6 7 8 9 11 ... 13 14 15 16 17 18 19 20 \ 
0 8 3 7 7 0 4 2 5 2 2 ... 0 8 4 0 9 6 2 4 
1 7 0 2 9 9 3 2 5 8 0 ... 6 2 0 8 2 5 1 8 
2 6 3 4 7 6 3 9 0 4 5 ... 6 6 2 4 2 7 1 6 

    21 10 
0 1 2 
1 1 1 
2 6 4 

[3 rows x 21 columns] 

解決方案與range

a = list(range(1,10)) + list(range(11,22)) + [10] 
new_df = my_df.iloc[:, a] 
print (new_df) 
    1 2 3 4 5 6 7 8 9 11 ... 13 14 15 16 17 18 19 20 \ 
0 8 3 7 7 0 4 2 5 2 2 ... 0 8 4 0 9 6 2 4 
1 7 0 2 9 9 3 2 5 8 0 ... 6 2 0 8 2 5 1 8 
2 6 3 4 7 6 3 9 0 4 5 ... 6 6 2 4 2 7 1 6 

    21 10 
0 1 2 
1 1 1 
2 6 4 

[3 rows x 21 columns] 
+0

它凸顯了指數。 – jezrael

+0

知道了,謝謝! –

+0

有一件事 - 'iloc'刪除最後的索引'9','21',你需要它嗎? – jezrael

2

我們可以使用np.r_[]

new_df = my_df.iloc[:, np.r_[1:9, 11:21, 10]] 

演示:

In [7]: df = pd.DataFrame(np.random.randint(5, size=(2, 21))) 

In [8]: df 
Out[8]: 
    0 1 2 3 4 5 6 7 8 9 ... 11 12 13 14 15 16 17 18 19 20 
0 2 1 2 2 1 0 4 4 4 2 ... 0 4 4 4 3 2 1 2 1 4 
1 1 4 4 4 1 3 4 4 3 3 ... 1 2 3 4 2 0 1 0 2 1 

[2 rows x 21 columns] 

In [9]: df.iloc[:, np.r_[1:9, 11:21, 10]] 
Out[9]: 
    1 2 3 4 5 6 7 8 11 12 13 14 15 16 17 18 19 20 10 
0 1 2 2 1 0 4 4 4 0 4 4 4 3 2 1 2 1 4 0 
1 4 4 4 1 3 4 4 3 1 2 3 4 2 0 1 0 2 1 0 
+0

文檔是有幫助的!好的謝謝! –

+0

@i.n.n.m,歡迎您! – MaxU