8

pandas文字列列をCategoricalに変換できますが、新しいDataFrame列として挿入しようとすると、Seriesofstrに変換されて戻ってくるようです。

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'

これを推測するのは、Categoricalがnumpydtypeにマップされないためです。それで、それをいくつかのint型に変換する必要があります。そのため、因子ラベル<->レベルの関連付けが失われますか?レベル<->ラベルの関連付けを保存し、元に戻す機能を保持するための最も洗練された回避策は何ですか?(ここのようにdictとして保存し、必要に応じて手動で変換しますか?) Rとは異なり、CategoricalはまだDataFrameのファーストクラスのデータ型ではないと思います。

(pandas 0.10.1、numpy 1.6.2、python 2.7.3を使用-すべての最新のmacportsバージョン)。

4

2 に答える 2

7

私が見つけた0.15より前のパンダの唯一の回避策は次のとおりです。

  • 列は分類子のカテゴリに変換する必要がありますが、numpyはすぐにレベルをintに戻し、因子情報を失います。
  • したがって、データフレーム外のグローバル変数に因子を格納します

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

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

[更新:パンダ0.15+はCategoricalのまともなサポートを追加しました]

于 2013-08-04T06:19:42.563 に答える
0

ラベル<->レベルはインデックスオブジェクトに保存されます。

  • 整数配列を文字列配列に変換するには:index [integer_array]
  • 文字列配列を整数配列に変換するには:index.get_indexer(string_array)

ここにいくつかの例があります:

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])
于 2013-03-12T12:49:15.903 に答える