概要
DataFrameのget_dummies()
メソッドは、属性データ(カテゴリーデータ)をone-hot-encodingの形に変換してくれる。
Scikit-learnにもOneHotEncoder
があるが、get_dumies()
はデータの切り貼りをせずにダイレクトに属性変数だけをone-hotの形にしてくれるので便利。
基本
get_dumies()
の引数にDataFrameを指定すると、文字列で属性指定されたデータが自動で認識されてon-hotの形に変換される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import pandas as pd data = [ ["male", 1200], ["male", 1000], ["male", 800], ["female", 1500], ["female", 800] ] df = pd.DataFrame(data, columns=["gender", "price"]) print(df) # gender price # 0 male 1200 # 1 male 1000 # 2 male 800 # 3 female 1500 # 4 female 800 print(pd.get_dummies(df)) # price gender_female gender_male # 0 1200 0 1 # 1 1000 0 1 # 2 800 0 1 # 3 1500 1 0 # 4 800 1 0 |
分解された列名は、"元の列名_属性名"
となり、それぞれに対応する属性の列のみが1、その他の列は0となる。列の並びは、属性名の辞書順。数値データの列は無視される。
属性データが複数列の場合
文字列の属性データが複数列ある場合も、自動的にone-hotに分解してくれる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
data = [ ["male", "Tokyo", 10000], ["male", "Tokyo", 70000], ["female", "Tokyo", 80000], ["male", "Nagoya", 7000], ["female", "Nagoya", 8000], ["female", "Nagoya", 6000], ["male", "Osaka", 9000], ["female", "Osaka", 79000], ] df = pd.DataFrame(data, columns=["gender", "city", "price"]) print(df) # gender city price # 0 male Tokyo 10000 # 1 male Tokyo 70000 # 2 female Tokyo 80000 # 3 male Nagoya 7000 # 4 female Nagoya 8000 # 5 female Nagoya 6000 # 6 male Osaka 9000 7 female Osaka 79000 print(pd.get_dummies(df)) # price gender_female gender_male city_Nagoya city_Osaka city_Tokyo # 0 10000 0 1 0 0 1 # 1 70000 0 1 0 0 1 # 2 80000 1 0 0 0 1 # 3 7000 0 1 1 0 0 # 4 8000 1 0 1 0 0 # 5 6000 1 0 1 0 0 # 6 9000 0 1 0 1 0 # 7 79000 1 0 0 1 0 |
属性が数値表現の場合
属性値が文字列ではなく数値表現の場合、get_dummies()
の引数に単にDataFrameを渡すだけでは変換してくれない(通常の数量データとして認識される)。
そこで、変換したい列をcolumns引数で指定する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
data = [ [1, 10, 100], [1, 20, 100], [2, 10, 200], [1, 20, 200], [1, 30, 100], ] df = pd.DataFrame(data, columns=["id1", "id2", "value"]) print(df) # id1 id2 value # 0 1 10 100 # 1 1 20 100 # 2 2 10 200 # 3 1 20 200 # 4 1 30 100 print(pd.get_dummies(df, columns=["id1"])) # id2 value id1_1 id1_2 # 0 10 100 1 0 # 1 20 100 1 0 # 2 10 200 0 1 # 3 20 200 1 0 # 4 30 100 1 0 |
複数の属性データの列がある場合、columns
引数でリスト指定する。
1 2 3 4 5 6 7 8 |
print(pd.get_dummies(df, columns=["id1", "id2"])) # value id1_1 id1_2 id2_10 id2_20 id2_30 # 0 100 1 0 1 0 0 # 1 100 1 0 0 1 0 # 2 200 0 1 1 0 0 # 3 200 1 0 0 1 0 # 4 100 1 0 0 0 1 |
属性名の指定
prefix
引数で文字列を指定すると、属性名がその文字列で置き換えられる。ただし複数の属性列が全て同じ文字列になる。
1 2 3 4 5 6 7 8 |
print(pd.get_dummies(df, columns=["id1", "id2"], prefix="attr")) # value attr_1 attr_2 attr_10 attr_20 attr_30 # 0 100 1 0 1 0 0 # 1 100 1 0 0 1 0 # 2 200 0 1 1 0 0 # 3 200 1 0 0 1 0 # 4 100 1 0 0 0 1 |
属性列ごとにprefix
を変えて指定したい場合はリストで指定。
1 2 3 4 5 6 7 8 |
print(pd.get_dummies(df, columns=["id1", "id2"], prefix=["attr", "cat"])) # value attr_1 attr_2 cat_10 cat_20 cat_30 # 0 100 1 0 1 0 0 # 1 100 1 0 0 1 0 # 2 200 0 1 1 0 0 # 3 200 1 0 0 1 0 # 4 100 1 0 0 0 1 |