Python 如何将列和行的DataFrame子集转换为numpy数组?

Python 如何将列和行的DataFrame子集转换为numpy数组?,python,arrays,numpy,pandas,scikit-learn,Python,Arrays,Numpy,Pandas,Scikit Learn,我想知道是否有一种更简单、内存效率更高的方法可以从数据帧中选择行和列的子集 例如,给定此数据帧: df = DataFrame(np.random.rand(4,5), columns = list('abcde')) print df a b c d e 0 0.945686 0.000710 0.909158 0.892892 0.326670 1 0.919359 0.667057 0.4

我想知道是否有一种更简单、内存效率更高的方法可以从数据帧中选择行和列的子集

例如,给定此数据帧:

df = DataFrame(np.random.rand(4,5), columns = list('abcde')) print df a b c d e 0 0.945686 0.000710 0.909158 0.892892 0.326670 1 0.919359 0.667057 0.462478 0.008204 0.473096 2 0.976163 0.621712 0.208423 0.980471 0.048334 3 0.459039 0.788318 0.309892 0.100539 0.753992 df=DataFrame(np.random.rand(4,5),columns=list('abcde')) 打印df a、b、c、d、e 0 0.945686 0.000710 0.909158 0.892892 0.326670 1 0.919359 0.667057 0.462478 0.008204 0.473096 2 0.976163 0.621712 0.208423 0.980471 0.048334 3 0.459039 0.788318 0.309892 0.100539 0.753992 我只需要列“c”的值大于0.5的那些行,但我只需要这些行的列“b”和“e”

这就是我想出的方法——也许有更好的“熊猫”方法

locs=[df.columns.get_loc(u)for_uin['a','d']] 打印df[df.c>0.5][locs] d 0 0.945686 0.892892 我的最终目标是将结果转换为numpy数组以传递到sklearn回归算法中,因此我将使用上面的代码,如下所示:

training_set = array(df[df.c > 0.5][locs]) 训练集=阵列(df[df.c>0.5][locs])
。。。这让我很恼火,因为我的内存中有一个巨大的数组副本。也许还有更好的方法吗?

直接使用它的值:

In [79]: df[df.c > 0.5][['b', 'e']].values
Out[79]: 
array([[ 0.98836259,  0.82403141],
       [ 0.337358  ,  0.02054435],
       [ 0.29271728,  0.37813099],
       [ 0.70033513,  0.69919695]])

对于第一个问题,您可以简单地通过列的名称访问这些列:

>>> df = pd.DataFrame(np.random.rand(4,5), columns = list('abcde'))
>>> df[df['c']>.5][['b','e']]
          b         e
1  0.071146  0.132145
2  0.495152  0.420219
关于第二个问题:

>>> df[df['c']>.5][['b','e']].values
array([[ 0.07114556,  0.13214495],
       [ 0.49515157,  0.42021946]])

.loc
同时接受行和列选择器(与
.ix/.iloc
FYI一样) 这也是一次通过完成的

In [1]: df = DataFrame(np.random.rand(4,5), columns = list('abcde'))

In [2]: df
Out[2]: 
          a         b         c         d         e
0  0.669701  0.780497  0.955690  0.451573  0.232194
1  0.952762  0.585579  0.890801  0.643251  0.556220
2  0.900713  0.790938  0.952628  0.505775  0.582365
3  0.994205  0.330560  0.286694  0.125061  0.575153

In [5]: df.loc[df['c']>0.5,['a','d']]
Out[5]: 
          a         d
0  0.669701  0.451573
1  0.952762  0.643251
2  0.900713  0.505775
如果您需要这些值(尽管这应该直接传递给sklearn as is);框架支持阵列接口

In [6]: df.loc[df['c']>0.5,['a','d']].values
Out[6]: 
array([[ 0.66970138,  0.45157274],
       [ 0.95276167,  0.64325143],
       [ 0.90071271,  0.50577509]])

我不知道.values属性。很不错的!另外,由于您消除了单引号和方括号,而是直接使用df.c.nice,所以稍微干净了一点,但是它与
as_matrix
有什么不同呢?只是一个更新,因为我只是想知道as_matrix和.values之间的区别(因为我只使用.values)。事实证明,提供as_矩阵只是为了向后兼容,建议改用.values。可悲的是,值不允许对列进行筛选或排序。最优雅的。.ix和.loc之间的区别是什么?loc根本不会尝试使用数字(例如1)作为位置参数(而是会引发);请参阅主文档/选择数据
In [6]: df.loc[df['c']>0.5,['a','d']].values
Out[6]: 
array([[ 0.66970138,  0.45157274],
       [ 0.95276167,  0.64325143],
       [ 0.90071271,  0.50577509]])