カテゴリカル変数のOneHotEncodingをしようと四苦八苦しました。scikit-learnのpreprocessingでなんとか、と思っていたんですが、結局pandasの関数で一瞬で解決することがわかったのでそれをメモしておきます。
数時間試行錯誤していたのがアホらしくなるほどあっさり解決してしまったので、きっといるであろう同じつまづきをしている世の技術者の助けになればと思います
参考
やりかた
Kaggleでも有名なtitanicのデータセットを使います。DataFrameとして取り込んだ状態から始めます
jupyter notebookの出力をそのまま使いたいところですが、Qiita上にうまいこと貼り付ける手段を知らないので、tableは別途csvtomdを使って生成したやつをコピペしてます。ご了承ください。
DataFrame読み込み
df_train = pd.read_csv("train.csv")
df_train.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22 | 1 | 0 | A/5 21171 | 7.25 | S | |
2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Thayer) | female | 38 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26 | 0 | 0 | STON/O2. 3101282 | 7.925 | S | |
4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35 | 1 | 0 | 113803 | 53.1 | C123 | S |
5 | 0 | 3 | Allen, Mr. William Henry | male | 35 | 0 | 0 | 373450 | 8.05 | S |
ダミー変数への変換
# カテゴリカル変数の1つである "Pclass" をエンコード
# プリフィックス "Pclass" をつけてカラムの判別がつくようにする
encoded = pd.get_dummies(df_train.Pclass, prefix=df_train.Pclass.name ,prefix_sep="_")
encoded.head()
Pclass_1 | Pclass_2 | Pclass_3 | |
---|---|---|---|
0 | 0 | 0 | 1 |
1 | 1 | 0 | 0 |
2 | 0 | 0 | 1 |
3 | 1 | 0 | 0 |
4 | 0 | 0 | 1 |
以上です。あとは DataFrame.drop
で元のPclass列を落として、代わりにこれらの列をjoinしてあげるだけです。関数を知ってしまえば一瞬なんですが、知らないことで無駄な時間を遣ってしまいました。