LoginSignup
5
4

More than 5 years have passed since last update.

[Python/pandas] カテゴリカル変数をいい感じに前処理する

Last updated at Posted at 2018-03-10

カテゴリカル変数のOneHotEncodingをしようと四苦八苦しました。scikit-learnのpreprocessingでなんとか、と思っていたんですが、結局pandasの関数で一瞬で解決することがわかったのでそれをメモしておきます。

数時間試行錯誤していたのがアホらしくなるほどあっさり解決してしまったので、きっといるであろう同じつまづきをしている世の技術者の助けになればと思います

参考

pandas - pandas.get_dummies

やりかた

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してあげるだけです。関数を知ってしまえば一瞬なんですが、知らないことで無駄な時間を遣ってしまいました。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4