次のような国のデータフレームがあるとします。
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に似たものがあることを期待しています。
最初に、列のタイプを変更します。
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)
シリーズを整数識別子に変換するだけの場合は、 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
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