カテゴリカルデータの救世主!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.
代替方法
- 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())
- ループによる手動変換
- この方法は、柔軟性を高めることができますが、時間がかかる場合があります。
- 少数のカテゴリカル列のみをダミー変数に変換する必要がある場合、ループを使用して手動で変換することができます。
# カテゴリカル列の値を取得
categories = df['カテゴリカル列'].unique()
# 各カテゴリに対してダミー変数列を作成
for category in categories:
df[f'dummy_{category}'] = (df['カテゴリカル列'] == category).astype(int)
- 辞書による変換
- この方法は、簡潔で読みやすいコードを作成できますが、スケーラビリティが低くなります。
- 少数のカテゴリカル列のみをダミー変数に変換する必要がある場合、辞書を使用して変換することができます。
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
パラメータを使用して未知のカテゴリを処理する方法を指定する必要があります。 - データセットが大きい場合は、メモリ使用量と計算コストを考慮する必要があります。
- どの方法を選択する場合でも、ダミー変数化によってデータフレームの次元が大幅に増加する可能性があることに注意する必要があります。