2013-03-12 1 views
7

можно преобразовать столбец панды строки в категоричен, но когда я пытаюсь вставить его в новом столбце DataFrame, кажется, преобразуются обратно в серию ула:Как сгенерировать столбец данных Pandas DataFrame из категориального столбца строки?

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' 

Гадания это потому, что категоричные Безразлично» t отображает любой numpy dtype; поэтому мне нужно преобразовать его в некоторый тип int и, таким образом, потерять метки факторов < -> levels association? Какое самое элегантное обходное решение для хранения уровней < -> ассоциация ярлыков и удержать возможность конвертировать назад? (Просто хранить в Словаре как here и вручную преобразовать в случае необходимости?) я думаю Categorical is still not a first-class datatype for DataFrame, в отличие от Р.

(Использование панд 0.10.1, NumPy 1.6.2, Python 2.7.3 - последние версии MacPorts все).

ответ

6

единственный обходной путь для панд предварительно 0.15 я нашел выглядит следующим образом:

  • столбец должен быть преобразован в категоричных для классификаторе, но NumPy сразу принуждать уровни обратно междунар, потери информации фактор
  • так хранить фактор в глобальной переменной вне dataframe

,

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

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

[UPDATE: панды 0.15+ added decent support for Categorical]

0

Этикетки < -> уровни хранятся в индексном объекте.

  • Чтобы преобразовать целое массив в массив строк: индекс [integer_array]
  • Чтобы преобразовать массив строк в массив целых чисел: index.get_indexer (string_array)

Вот некоторые 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

Я знаю, что, но проблема здесь все это получает взорвано обратно к Силе, когда мы относим к колонку DataFrame, как я показал: 'поезда [«LocationNFactor» ] = pd.Categorical ... ' – smci

Смежные вопросы