web-dev-qa-db-ja.com

パンダ:カテゴリを数字に変換する

次のような国のデータフレームがあるとします。

cc | temp
US | 37.0
CA | 12.0
US | 35.0
AU | 20.0

国を「ワンホットエンコーディング」に変換するpd.get_dummies関数があることを知っています。ただし、代わりにcc_index = [1,2,1,3]を取得するように、代わりにインデックスに変換したいと思います。

以下に示すように、numpyのwhere句とともにget_dummiesを使用するよりも速い方法があると想定しています。

[np.where(x) for x in df.cc.get_dummies().values]

これはRで 'factors'を使用する方がやや簡単なので、pandasに似たものがあることを期待しています。

45
sachinruk

最初に、列のタイプを変更します。

df.cc = pd.Categorical(df.cc)

これで、データは似たように見えますが、カテゴリ別に保存されます。カテゴリコードをキャプチャするには:

df['code'] = df.cc.cat.codes

今、あなたは持っています:

   cc  temp  code
0  US  37.0     2
1  CA  12.0     1
2  US  35.0     2
3  AU  20.0     0

DataFrameを変更したくないが、単にコードを取得する場合:

df.cc.astype('category').cat.codes

または、カテゴリカル列をインデックスとして使用します。

df2 = pd.DataFrame(df.temp)
df2.index = pd.CategoricalIndex(df.cc)
93
John Zwinck

シリーズを整数識別子に変換するだけの場合は、 pd.factorize を使用できます。

このソリューションは、pd.Categoricalとは異なり、アルファベット順にソートされないことに注意してください。したがって、最初の国には0が割り当てられます。 1から開始する場合は、定数を追加できます。

df['code'] = pd.factorize(df['cc'])[0] + 1

print(df)

   cc  temp  code
0  US  37.0     1
1  CA  12.0     2
2  US  35.0     1
3  AU  20.0     3

アルファベット順に並べ替える場合は、sort=Trueを指定します。

df['code'] = pd.factorize(df['cc'], sort=True)[0] + 1 
15
jpp

sklearn ライブラリを使用している場合、 LabelEncoder を使用できます。 pd.Categoricalと同様に、入力文字列はエンコードの前にアルファベット順にソートされます。

from sklearn.preprocessing import LabelEncoder

LE = LabelEncoder()
df['code'] = LE.fit_transform(df['cc'])

print(df)

   cc  temp  code
0  US  37.0     2
1  CA  12.0     1
2  US  35.0     2
3  AU  20.0     0
4
jpp