カテゴリカルデータの救世主!pandas.get_dummiesの基礎と応用


pandas.get_dummies 関数は、カテゴリカルデータをダミー変数に変換するための強力なツールです。ダミー変数とは、各カテゴリに対して 1 または 0 の値を持つバイナリ変数です。この関数は、機械学習モデルでカテゴリカルデータを扱う際に有用です。

使い方

import pandas as pd

# データフレームを作成
df = pd.DataFrame({'カテゴリカル列': ['A', 'B', 'C', 'A', 'B']})

# ダミー変数に変換
df_dummy = pd.get_dummies(df['カテゴリカル列'])

# 結果を表示
print(df_dummy)

このコードを実行すると、以下の出力結果が表示されます。

    A  B  C
0  1  0  0
1  0  1  0
2  0  0  1
3  1  0  0
4  0  1  0

オプション

pandas.get_dummies 関数は、いくつかのオプション引数を受け取ります。

  • drop_first: 最初のダミー変数を削除するかどうかを指定します。デフォルトは False です。
  • sparse: データフレームではなく疎行列で結果を返すかどうかを指定します。デフォルトは False です。
  • columns: ダミー変数に変換する列を指定します。デフォルトは、データフレームのすべてのカテゴリカル列です。
  • dummy_na: NaN 値をダミー変数として扱うかどうかを指定します。デフォルトは False です。
  • prefix_sep: 接頭辞とカテゴリ名の区切り文字を指定します。デフォルトは '_' です。
  • prefix: ダミー変数の接頭辞を指定します。デフォルトは None です。

# 接頭辞と区切り文字を指定
df_dummy = pd.get_dummies(df['カテゴリカル列'], prefix='cat', prefix_sep='-')
print(df_dummy)
    cat_A  cat_B  cat_C
0  1  0  0
1  0  1  0
2  0  0  1
3  1  0  0
4  0  1  0

機械学習への応用

pandas.get_dummies 関数は、機械学習モデルでカテゴリカルデータを扱う際に役立ちます。多くの機械学習モデルは、数値データのみを扱うように設計されています。カテゴリカルデータをダミー変数に変換することで、これらのモデルでカテゴリカルデータを扱うことができます。

pandas.get_dummies 関数は、カテゴリカルデータをダミー変数に変換するための便利なツールです。機械学習モデルでカテゴリカルデータを扱う際に役立ちます。

  • pandas.get_dummies 関数は、データフレームの次元を増加させる可能性があります。データセットが大きい場合は、メモリ使用量に注意してください。
  • pandas.get_dummies 関数は、カテゴリカル変数が少数のカテゴリのみを持つ場合にのみ使用してください。カテゴリカル変数が多数のカテゴリを持つ場合は、ワンホットエンコーディングを使用する方が効率的です。


例 1:複数のカテゴリカル列を持つデータフレーム

この例では、複数のカテゴリカル列を持つデータフレームをダミー変数に変換します。

import pandas as pd

# データフレームを作成
df = pd.DataFrame({
    'カテゴリカル列1': ['A', 'B', 'C', 'A', 'B'],
    'カテゴリカル列2': ['X', 'Y', 'Z', 'X', 'Y']
})

# ダミー変数に変換
df_dummy = pd.get_dummies(df)

# 結果を表示
print(df_dummy)
    カテゴリカル列1_A  カテゴリカル列1_B  カテゴリカル列1_C  カテゴリカル列2_X  カテゴリカル列2_Y  カテゴリカル列2_Z
0  1                0                0  1                0                0
1  0                1                0  0                1                0
2  0                0                1  0                0                1
3  1                0                0  1                0                0
4  0                1                0  0                1                0

例 2:接頭辞と区切り文字を指定

この例では、接頭辞と区切り文字を指定してダミー変数を作成します。

import pandas as pd

# データフレームを作成
df = pd.DataFrame({'カテゴリカル列': ['A', 'B', 'C', 'A', 'B']})

# ダミー変数に変換
df_dummy = pd.get_dummies(df['カテゴリカル列'], prefix='cat', prefix_sep='-')

# 結果を表示
print(df_dummy)
    cat_A  cat_B  cat_C
0  1  0  0
1  0  1  0
2  0  0  1
3  1  0  0
4  0  1  0

例 3:NaN 値をダミー変数として扱う

この例では、NaN 値をダミー変数として扱うように指定します。

import pandas as pd

# データフレームを作成
df = pd.DataFrame({'カテゴリカル列': ['A', 'B', 'C', 'A', 'B', np.nan]})

# ダミー変数に変換
df_dummy = pd.get_dummies(df['カテゴリカル列'], dummy_na=True)

# 結果を表示
print(df_dummy)
    A  B  C  NaN
0  1  0  0  0
1  0  1  0  0
2  0  0  1  0
3  1  0  0  0
4  0  1  0  0
5  0  0  0  1

例 4:特定の列のみをダミー変数に変換

この例では、特定の列のみをダミー変数に変換します。

import pandas as pd

# データフレームを作成
df = pd.DataFrame({
    'カテゴリカル列': ['A', 'B', 'C', 'A', 'B'],
    '数値列': [1, 2, 3, 4, 5]
})

# 特定の列のみをダミー変数に変換
df_dummy = pd.get_dummies(df[['カテゴリカル列']], columns=['カテゴリカル列'])

# 結果を表示
print(df_dummy)
    カテゴリカル列_A  カテゴリカル列_B  カテゴリカル列_C
0  1                0                0
1  0                1                0
2  0                0                1
3  1                0                0
4  0                1                0

例 5:疎行列として結果を返す

この例では、結果を疎行列として返します。

import pandas as pd
import scipy.sparse

# データフレームを作成
df = pd.DataFrame({'カテゴリカル列': ['A', 'B', 'C', 'A', 'B']})

# ダミー変数を変換
df_dummy = pd.


代替方法

  1. Scikit-learn の OneHotEncoder
  • OneHotEncoder は、パイプラインなどの Scikit-learn ワークフローに簡単に統合できます。
  • OneHotEncoder は、pandas.get_dummies よりも効率的に動作する場合があります。
  • Scikit-learn の OneHotEncoder は、pandas.get_dummies と同様の機能を提供します。
from sklearn.preprocessing import OneHotEncoder

# データを NumPy 配列に変換
data = df['カテゴリカル列'].to_numpy()

# OneHotEncoder をインスタンス化
encoder = OneHotEncoder(handle_unknown='ignore')

# ダミー変数を生成
dummy_data = encoder.fit_transform(data.reshape(-1, 1))

# ダミー変数を DataFrame に変換
df_dummy = pd.DataFrame(dummy_data, columns=encoder.get_feature_names_out())
  1. ループによる手動変換
  • この方法は、柔軟性を高めることができますが、時間がかかる場合があります。
  • 少数のカテゴリカル列のみをダミー変数に変換する必要がある場合、ループを使用して手動で変換することができます。
# カテゴリカル列の値を取得
categories = df['カテゴリカル列'].unique()

# 各カテゴリに対してダミー変数列を作成
for category in categories:
    df[f'dummy_{category}'] = (df['カテゴリカル列'] == category).astype(int)
  1. 辞書による変換
  • この方法は、簡潔で読みやすいコードを作成できますが、スケーラビリティが低くなります。
  • 少数のカテゴリカル列のみをダミー変数に変換する必要がある場合、辞書を使用して変換することができます。
dummy_cols = {category: f'dummy_{category}' for category in df['カテゴリカル列'].unique()}

df = df.assign(**{col: (df['カテゴリカル列'] == category).astype(int) for col, category in dummy_cols.items()})

それぞれの方法の比較

方法利点欠点
pandas.get_dummiesシンプルで使いやすいデータフレームの次元を増加させる可能性がある
Scikit-learn の OneHotEncoder効率的で、Scikit-learn ワークフローに簡単に統合できるpandas フレームワークの外で動作する
ループによる手動変換柔軟性が高い時間のかかる場合がある
辞書による変換簡潔で読みやすいコードスケーラビリティが低い

pandas.get_dummies 関数は、カテゴリカルデータをダミー変数に変換するための汎用的なツールですが、状況に応じて適切な方法を選択することが重要です。上記の代替方法を検討することで、より効率的でスケーラブルなソリューションを設計することができます。

  • OneHotEncoder を使用する場合は、handle_unknown パラメータを使用して未知のカテゴリを処理する方法を指定する必要があります。
  • データセットが大きい場合は、メモリ使用量と計算コストを考慮する必要があります。
  • どの方法を選択する場合でも、ダミー変数化によってデータフレームの次元が大幅に増加する可能性があることに注意する必要があります。