2013-07-16 85 views
41

我想知道是否有一个更简单,有效的内存方法来从熊猫数据框中选择行和列的子集。如何将pandas DataFrame的子列和行转换为numpy数组?

例如,给定此数据帧:

 
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 

我想只有那些在其中用于列“c”的值大于0.5的行,但我只需要列“b”和“E”为那些行。

这是我提出的方法 - 也许有更好的“熊猫”方式?

 
locs = [df.columns.get_loc(_) for _ in ['a', 'd']] 
print df[df.c > 0.5][locs] 

      a   d 
0 0.945686 0.892892 

我的最终目标是将结果转换为numpy的阵列传递到sklearn回归算法,所以我就用上面的代码是这样的:

 
training_set = array(df[df.c > 0.5][locs]) 

...那眼中钉因为我最终在内存中获得了巨大的阵列副本。也许有更好的办法呢?

回答

8

.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原样);帧支持阵列接口

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]]) 
+0

最优雅。 .ix和.loc有什么区别? –

+0

loc不会尝试使用数字(例如1)作为位置参数(并且会改为)。请参阅主要熊猫文档/选择数据 – Jeff

70

直接使用它的值:

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]]) 
+0

我不知道.values属性。非常好!此外,由于您消除了单引号和括号,并且直接使用df.c,所以稍微更清洁。 –

+1

不错,但它与'as_matrix'有什么不同呢? – dashesy

+5

只是一个更新,因为我只是想知道as_matrix和.values之间的区别(因为我只使用.values)。事实证明,as_matrix只是为了向后兼容而提供的,建议使用.values代替。请参阅http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.DataFrame.as_matrix.html – DkM

16

也许这样的事情对于第一个问题,你可以简单地通过自己的名字访问列:

>>> 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]]) 
相关问题