2013-03-12 6 views
7

Ich kann eine Pandas String-Spalte zu kategorischen, konvertieren, aber wenn ich versuche, es als eine neue Dataframe Spalte einzufügen scheint es gleich wieder zu der Serie von str umgewandelt werden:Wie Pandas DataFrame-Spalte von Categorical von String-Spalte zu generieren?

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' 

Erraten ist dies, weil kategorische ‚doesn t Zu jedem numpy dtype mappen; also muss ich es in einen int-typ konvertieren, und damit die faktor labels < verlieren -> levels association? Was ist die eleganteste Problemumgehung zum Speichern der Ebenen < -> Etiketten Assoziation und behalten die Fähigkeit, zurück zu konvertieren? (Speichert nur als dict wie here und manuell konvertieren, wenn erforderlich?) ich Categorical is still not a first-class datatype for DataFrame denken, im Gegensatz zu R.

(mit Pandas 0.10.1, numpy 1.6.2, Python 2.7.3 - die neuesten Versionen von Macports alles).

Antwort

6

Die einzige Abhilfe für Pandas vorge 0,15 I wird wie folgt ermittelt:

  • Spalte muss für Klassifikator auf eine kategorische umgewandelt werden, aber numpy wird sofort die Pegel zurück zu int zwingen, den Faktor Informationen zu verlieren
  • so speichern, den Faktor in einer globalen Variablen außerhalb der Datenrahmen

.

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

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

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

0

Die Labels < -> levels wird im Indexobjekt gespeichert.

  • eine ganze Zahl Array String-Array zu konvertieren: Index [integer_array]
  • ein String-Array zu konvertieren, um Ganzzahl-Array: index.get_indexer (string_array)

Hier einige exampe ist:

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

Ich weiß, dass, aber das Problem hier ist alles zurück auf str gestrahlt wird, wenn wir zu einer Dataframe Spalte zuweisen, wie ich zeigte: 'Zug [‚LocationNFactor‘ ] = pd.Categorical ... ' – smci