2013-03-12 20 views
7

mogę przekonwertować kolumnę pandy ciąg do kategoryczny, ale gdy próbuję wstawić je jako nowe kolumny DataFrame wydaje zamieniony z powrotem do serii str:Jak wygenerować kolumnę DataFrame pandy klasy Categorical z kolumny łańcucha?

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' 

odgadywanie to dlatego Categorical robi” t mapować do dowolnego numpy dtype; więc czy muszę go przekonwertować na jakiś typ int, a tym samym stracić etykietę współczynników < -> poziomy asocjacji? Jakie jest najbardziej eleganckie obejście do przechowywania poziomów < -> powiązanie etykiet i zachować możliwość konwersji z powrotem? (Tylko zapisać jako dict jak here i ręcznie konwertować, gdy są potrzebne?) myślę Categorical is still not a first-class datatype for DataFrame, w przeciwieństwie do R.

(Korzystanie pandy 0.10.1, numpy 1.6.2, Python 2.7.3 - najnowsza DarwinPorts wersjach wszystko).

Odpowiedz

6

jedynym obejście pand wstępnie 0,15 że ustalono w sposób następujący:

  • kolumna muszą być zamienione na kategoryczne dla klasyfikatora, ale numpy natychmiast zmusić poziomów z powrotem do int, utraty informacji czynnik
  • więc przechowywać czynnik w zmiennej globalnej poza dataframe

.

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

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

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

0

Etykiety < -> poziomy są przechowywane w obiekcie indeksu.

  • Przekształcanie tablicę liczb tablicy wyrażenie: indeks [integer_array]
  • celu przekształcenia tablicy ciągu całkowitoliczbowa tablicy: index.get_indexer (string_array)

Oto 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

Wiem o tym, ale problemem jest to, że wszystko zostaje wysadzony z powrotem do STR kiedy przypisać do kolumny DataFrame, jak pokazałem: 'pociąg [ 'LocationNFactor' ] = pd.Categorical ... ' – smci

Powiązane problemy