2013-03-12 13 views
7

posso convertire una colonna stringa di panda a categoriale, ma quando cerco di inserirlo come nuova colonna dataframe sembra convertirsi destra di nuovo serie di str:Come generare la colonna DataFrame dei pandi di Categorical dalla colonna di stringhe?

train['LocationNFactor'] = pd.Categorical.from_array(train['LocationNormalized']) 

>>> type(pd.Categorical.from_array(train['LocationNormalized'])) 
<class 'pandas.core.categorical.Categorical'> 
# however it got converted back to... 
>>> type(train['LocationNFactor'][2]) 
<type 'str'> 
>>> train['LocationNFactor'][2] 
'Hampshire' 

indovinare questo è perché categoriale doesn' t mappare su qualsiasi tipo di carattere numerico; così devo convertirlo in un tipo int, e quindi perdere le etichette dei fattori < -> livelli di associazione? Qual è la soluzione più elegante per archiviare i livelli < -> associazione etichette e mantenere la capacità di riconvertire? (Solo memorizzare come dict come here, e manualmente la conversione in caso di necessità?) Penso Categorical is still not a first-class datatype for DataFrame, a differenza di R.

(Usando panda 0.10.1, NumPy 1.6.2, Python 2.7.3 - le più recenti versioni di macports qualunque cosa).

risposta

6

L'unica soluzione per panda pre-0.15 ho trovato è il seguente:

  • colonna deve essere convertito in un categorico per classificatore, ma NumPy immediatamente costringere i livelli di nuovo a int, perdere le informazioni fattore
  • così conservare il fattore in una variabile globale al di fuori del dataframe

.

train_LocationNFactor = pd.Categorical.from_array(train['LocationNormalized']) # default order: alphabetical 

train['LocationNFactor'] = train_LocationNFactor.labels # insert in dataframe 

[UPDATE: panda 0.15+ added decent support for Categorical]

0

I livelli di etichetta < -> sono memorizzati nell'oggetto indice.

  • Per convertire un array intero a matrice di stringhe: indice [integer_array]
  • Per convertire una matrice di stringhe a intero array: index.get_indexer (string_array)

Ecco alcuni exampe:

In [56]: 

c = pd.Categorical.from_array(['a', 'b', 'c', 'd', 'e']) 

idx = c.levels 

In [57]: 

idx[[1,2,1,2,3]] 

Out[57]: 

Index([b, c, b, c, d], dtype=object) 

In [58]: 

idx.get_indexer(["a","c","d","e","a"]) 

Out[58]: 

array([0, 2, 3, 4, 0]) 
+2

Lo so, ma il problema qui è che tutto viene fatto saltare di nuovo a str quando assegniamo a una colonna dataframe, come ho mostrato: 'treno [ 'LocationNFactor' ] = pd.Categorical ... ' – smci

Problemi correlati