2015-10-14 40 views
2

我想選擇索引1處的列,然後選擇索引2和5之間的一個隨機列。此代碼在選擇隨機列時起作用:在DF和隨機列中選擇一個特定列(python3,pandas)

train_cols = train.columns[[random.sample(range(2, 5), 1)]] 

但是,當我試圖在索引1添加「常量」列這是行不通的

train_cols = train.columns[1,[random.sample(range(2, 5), 1)]] 

任何幫助將是巨大的!謝謝

回答

1

train.columns基本上是一維numpy數組,所以你應該看看http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html

讓我們這個陣列爲例:

In [2]: x = np.array(['a', 'b', 'c', 'd', 'e', 'f']) 

(1)索引與的整數返回該位置處的元件:

In [3]: x[3] 
Out[3]: 'd' 

(2)索引與列表返回數組在給定位置處的值:

In [4]: x[[3, 5]] 
Out[4]: 
array(['d', 'f'], 
     dtype='|S1') 

(3)使用多個值索引在列表用於多維數組,這樣就不會在我們的例子中工作:

In [5]: x[3, 5] 
--------------------------------------------------------------------------- 
IndexError        Traceback (most recent call last) 
<ipython-input-8-37ec23c8a033> in <module>() 
----> 1 x[3, 5] 

IndexError: too many indices for array 

現在,random.sample返回一個列表,讓你的第一個命令上面做這樣的事情:

In [6]: x[[[2]]] 
Out[6]: 
array(['c'], 
     dtype='|S1') 

但是,您的第二個命令將執行類似於x[1, [[2]]]的操作,因爲上述#3不起作用的原因不起作用。

你想要的是像x[[1, 2]],並獲得這將是最好的辦法:

In[7]: x[[1, random.randint(2, 4)]] 

這將工作,因爲random.randint返回一個整數,而不是一個列表。

+0

這使得總體感和感謝您的解釋 - - 我想知道如何將其推廣到其他項目,以及如果我想選擇多個隨機列(train_cols = random.sample(range(2,5),2) – user3682157

+1

這是否會工作在這種情況下,您可以使用'x [[1] + random.sample(range(2,5),2)]',其中加號連接兩個列表。 –

+0

希望我能給你幾個upvotes,解釋這個解決方案的簡單和直接。 – user3682157

1

a是:

a = random.sample(range(2, 5), 1) 

由於a是一個列表,我只想做這一招,使其工作:

train_cols = train.columns[[1,a[0]]] 
+0

這適用於一列,但有什麼辦法讓這項工作的多列如果說,train_cols = random.sample(範圍(2,5),2) – user3682157