2016-06-09 80 views
1

我有一个numpy.core.records .recarray类型的对象。我想将它有效地用作熊猫数据框。更确切地说,我想使用它的列的子集来获得新的数组,就像你做pandas_dataframe[[selected_columns]]一样。从numpy recarray中选择列

实现此目的的最简单方法是什么?

回答

1

不使用熊猫,您可以选择结构化数组的字段子集(重新数组)。例如:

In [338]: dt=np.dtype('i,f,i,f') 
In [340]: A=np.ones((3,),dtype=dt) 
In [341]: A[:]=(1,2,3,4) 

In [342]: A 
Out[342]: 
array([(1, 2.0, 3, 4.0), (1, 2.0, 3, 4.0), (1, 2.0, 3, 4.0)], 
     dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<i4'), ('f3', '<f4')]) 

该字段的子集。

In [343]: B=A[['f1','f3']].copy() 

In [344]: B 
Out[344]: 
array([(2.0, 4.0), (2.0, 4.0), (2.0, 4.0)], 
     dtype=[('f1', '<f4'), ('f3', '<f4')]) 

可以独立的A进行修改:

In [346]: B['f3']=[.1,.2,.3] 

In [347]: B 
Out[347]: 
array([(2.0, 0.10000000149011612), (2.0, 0.20000000298023224), 
     (2.0, 0.30000001192092896)], 
     dtype=[('f1', '<f4'), ('f3', '<f4')]) 

In [348]: A 
Out[348]: 
array([(1, 2.0, 3, 4.0), (1, 2.0, 3, 4.0), (1, 2.0, 3, 4.0)], 
     dtype=[('f0', '<i4'), ('f1', '<f4'), ('f2', '<i4'), ('f3', '<f4')]) 

字段的结构化子集不会高度发达。 A[['f0','f1']]已足够查看,但如果您尝试修改该子集,它会发出警告或发出错误。这就是为什么我使用copyB

有一组函数可以方便地从recarrays中添加和删除字段。我将不得不查找访问模式。但主要是构建一个新的dtype和空数组,然后按名称复制字段。

import numpy.lib.recfunctions as rf