2016-06-09 16 views
1

Ich habe ein Objekt vom Typ numpy.core.records .recarray. Ich möchte es effektiv als Pandas Datenrahmen verwenden. Genauer gesagt, möchte ich eine Teilmenge seiner Spalten verwenden, um eine neue Wiederherstellung zu erhalten, so wie Sie es tun würden pandas_dataframe[[selected_columns]].Spalten aus numpy recarray auswählen

Was ist der einfachste Weg, dies zu erreichen?

Antwort

1

Ohne Pandas zu verwenden, können Sie eine Teilmenge der Felder eines strukturierten Arrays (recarray) auswählen. Zum Beispiel:

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')]) 

eine Teilmenge der Felder.

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')]) 

, die unabhängig von A geändert werden kann:

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')]) 

Die strukturierte Teilmenge von Feldern ist nicht hoch entwickelt. A[['f0','f1']] reicht aus, um angezeigt zu werden, aber es wird eine Warnung ausgegeben oder ein Fehler ausgegeben, wenn Sie versuchen, diese Teilmenge zu ändern. Deshalb habe ich copy mit B verwendet.

Es gibt eine Reihe von Funktionen, die das Hinzufügen und Entfernen von Feldern aus Rekarrays erleichtern. Ich muss das Zugangsmuster nachschlagen. Aber meistens das Konstrukt ein neues dtype, und leeren Array, und kopieren Sie dann Felder nach Namen.

import numpy.lib.recfunctions as rf 
Verwandte Themen