Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

hassaku_63
AWSのパートナー企業のSIer中の人です。所謂社内SE のロールです 自社の運用サービス(MSP) で内製してる基盤システムの保守開発やってます。あと、他部署の業務改善。要件ヒアリングしたり、運用中の SaaS を業務要件に合うように運用方法考えたり、必要なら内製開発したりそれの保守したり。 Note: https://note.mu/8saku
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away