2015-10-14 43 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