kakakakakku blog

Weekly Tech Blog : Keep on Learning 👍

Pandas の get_dummies() 関数でカテゴリ変数をダミー変数に変換する

Pandasget_dummies() 関数を使うと「カテゴリ変数」「ダミー変数」に変換できる.「カテゴリ変数」とは,例えば「血液型」「職業」など,限られた選択肢の中から選んだ値で,ENUM 型のようなイメージをするとわかりやすい💡分析業務を前提に考えると ABAB など,文字列のままだと計算しにくく,機械学習などの前処理として数値にエンコーディングする必要がある.そこで get_dummies() 関数を使う.今回は get_dummies() 関数の基本的な操作を試す.

pandas.pydata.org

データセット 🏷

今回の検証では,GitHub リポジトリ chendaniely/pandas_for_everyone に含まれているデータセット gapminder.tsv を使う.これは「国名 / 大陸名 / 平均余命などをまとめたデータセット」となり,1700 行程度含まれている.あくまでサンプルとして使う.GitHub リポジトリ jennybc/gapminder には Gapminder の公式データも載っている.

gapminder = pd.read_csv('./gapminder.tsv', delimiter='\t')
gapminder

f:id:kakku22:20210430210345p:plain

get_dummies() 関数を使う 🏷

get_dummies() 関数の引数に DataFrame を指定する.デフォルトでは「文字列」など dtypeobject の全てのカラムを「ダミー変数」に変換する.スクリーンショットには一部しか表示されていないけど countrycontinent が変換対象となる.具体的には country の値によって,新しいカラム country_Afghanistancountry_Albania が追加されていて,それぞれの値は 01 になっている.なお,このように「N 個の値」に対して「N 個のカラム」を追加する方法を「One-Hot エンコーディング」と言う.

  • country_Afghanistan
  • country_Albania
  • country_Algeria
  • country_Angola
  • country_Argentina
  • etc
pd.get_dummies(gapminder).head(20)

f:id:kakku22:20210430210633p:plain

columns パラメータを使う 🏷

get_dummies() 関数に columns パラメータを指定すると「ダミー変数」に変換するカラムを指定できる.今回は continent を指定した.すると country はそのままとなり,新しいカラム continent_Africacontinent_Americas が追加された.

  • continent_Africa
  • continent_Americas
  • continent_Asia
  • continent_Europe
  • continent_Oceania
pd.get_dummies(gapminder, columns=['continent']).head(20)

f:id:kakku22:20210430211856p:plain

prefix_sep パラメータを使う 🏷

country_Afghanistancontinent_Africa など,デフォルトでは _ をセパレータとして新しいカラムが追加される.そこで prefix_sep パラメータを指定すると任意のセパレータに変更できる.今回はサンプルとして prefix_sep='/' とした.すると continent/Africacontinent/Americas など,期待通りにセパレータを変更できた.

pd.get_dummies(gapminder, columns=['continent'], prefix_sep='/').head(20)

f:id:kakku22:20210430212324p:plain

dummy_na パラメータを使う 🏷

get_dummies() 関数はデフォルトでは NaN を無視する.そこで dummy_na パラメータに True を指定すると continent/nan のように NaN も値として変換される.

pd.get_dummies(gapminder, columns=['continent'], prefix_sep='/', dummy_na=True).head(20)

f:id:kakku22:20210430212551p:plain

まとめ 🏷

Pandas「カテゴリ変数」「ダミー変数」に変換する get_dummies() 関数を試した.値によって新しいカラムを追加する「One-Hot エンコーディング」を簡単に実現できた.試せば試すほど Pandas の機能の豊富さに驚かされる.引き続き学んでいくぞ👍