Pandas pd.get_dummies() 関数
pd.get_dummies()はPandasライブラリ内で使用される、分類変数のワンホットエンコーディング(One-Hot Encoding)のための関数です。それは分類変数をバイナリ(0/1)列の形式に変換し、各カテゴリが1列に対応します。
ワンホットエンコーディングは機械学習の前処理でよく使用される技術です。ほとんどのアルゴリズムは分類データを直接処理できないため、数値形式に変換する必要があります。
単語の意味: get_dummiesこのうち、"dummy" はここでは「ダミー変数」の意味であり、統計学や計量経済学において分類変数を表すバイナリ変数を指します。
基本構文とパラメータ
pd.get_dummies()Pandas ライブラリのトップレベル関数であり、分類変数をワンホットエンコーディング形式に変換するために使用されます。
構文形式
pd.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, drop_first=False, dtype=None)
パラメータの説明
- パラメータ:
data- 型: Series、DataFrame、または配列に類似したオブジェクト。
- 説明: ワンホットエンコーディングを行うデータ。通常は分類変数を含む Series または DataFrame です。
- パラメータ:
prefix- 型: 文字列、文字列のリスト、または辞書。
- 説明: 生成される新しい列名のプレフィックス。指定しない場合は、元の列名がプレフィックスとして使用されます。
- パラメータ:
prefix_sep- 型: 文字列。
- 説明: プレフィックスとカテゴリ名の間の区切り文字。デフォルトはアンダースコア(_)です。
'_'。
- パラメータ:
dummy_na- 型: ブール値。
- 説明: もし
Trueの場合、欠損値(NaN)のためにも専用の列を作成します。デフォルトはFalse。
- パラメータ:
columns- 型: リストまたは None。
- 説明: エンコードする列名。指定しない場合は、object、category、または boolean 型のすべての列がエンコードされます。
- パラメータ:
drop_first- 型: ブール値。
- 説明: もし
Trueの場合、多重共線性を避けるために各分類変数の最初の列を削除します。ロジスティック回帰などのモデルでダミー変数トラップを回避できます。デフォルトはFalse。
関数の説明
- 戻り値: 各カテゴリに対応する列を持つ DataFrame を返します。値は 0 または 1 です。
- 効果: 分類変数を数値型のバイナリ列に変換し、機械学習アルゴリズムが処理しやすくします。
例
簡単なものから複雑なものまでの一連の例を通して、完全に習得しましょう。pd.get_dummies()の使い方。
例1:基本の使い方 - Series にワンホットエンコーディングを行う
例
import pandas as pd
# 1. 分類変数を含む Series を作成する
colors = pd.Series(['red', 'blue', 'green', 'red', 'green', 'blue'])
print("=== 元の Series ===")
print(colors)
# 2. pd.get_dummies() を使用してワンホットエンコーディングを行う
result = pd.get_dummies(colors)
print("\n=== pd.get_dummies() によるワンホットエンコーディング結果 ===")
print(result)
# 1. 分類変数を含む Series を作成する
colors = pd.Series(['red', 'blue', 'green', 'red', 'green', 'blue'])
print("=== 元の Series ===")
print(colors)
# 2. pd.get_dummies() を使用してワンホットエンコーディングを行う
result = pd.get_dummies(colors)
print("\n=== pd.get_dummies() によるワンホットエンコーディング結果 ===")
print(result)
実行結果の想定:
=== 原始 Series ===
0 red
1 blue
2 green
3 red
4 green
5 blue
dtype: object
=== pd.get_dummies() 独热编码结果 ===
blue green red
0 False False True
1 True False False
2 False True False
3 False False True
4 False True False
5 True False False
コードの解説:
- 元の Series には red、blue、green の3色が含まれます。
- ワンホットエンコーディング後、各色が1列になり、
True/Falseでその行がそのカテゴリに属するかどうかを表します。 - 各行にはただ1つの
Trueがあり、元の色の値に対応します。
例2:DataFrame の指定列をエンコードする
データ分析では、通常、特定の分類列のみをエンコードし、数値列はそのままにします。
例
import pandas as pd
# 1. 数値と分類変数を含む DataFrame を作成する
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
'age': [25, 30, 35, 28],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou'],
'department': ['Sales', 'Engineering', 'Sales', 'HR']
})
print("=== 元の DataFrame ===")
print(df)
# 2. 指定した分類列にワンホットエンコーディングを行う
result = pd.get_dummies(df, columns=['city', 'department'])
print("\n=== city 列と department 列にワンホットエンコーディングを行う ===")
print(result)
# 1. 数値と分類変数を含む DataFrame を作成する
df = pd.DataFrame({
'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
'age': [25, 30, 35, 28],
'city': ['Beijing', 'Shanghai', 'Beijing', 'Guangzhou'],
'department': ['Sales', 'Engineering', 'Sales', 'HR']
})
print("=== 元の DataFrame ===")
print(df)
# 2. 指定した分類列にワンホットエンコーディングを行う
result = pd.get_dummies(df, columns=['city', 'department'])
print("\n=== city 列と department 列にワンホットエンコーディングを行う ===")
print(result)
実行結果の想定:
=== 原始 DataFrame ===
name age city department
0 Alice 25 Beijing Sales
1 Bob 30 Shanghai Engineering
2 Charlie 35 Beijing Sales
3 Diana 28 Guangzhou HR
=== 对 city 和 department 列进行独热编码 ===
name age city_Beijing city_Guangzhou city_Shanghai department_Engineering department_HR department_Sales
0 Alice 25 True False False False True
1 Bob 30 False False True True False
2 Charlie 35 True False False False True
3 Diana 28 False True False False False
コードの解説:
- を使用して
columns指定した列のみをcityとdepartmentエンコードします。 - 数値列
ageとテキスト列nameはそのまま保持されます。 - 新しく生成された列名は、デフォルトの区切り文字であるアンダースコアを使用します。例:
city_Beijing。
例3:プレフィックスと区切り文字をカスタマイズする
を使用してprefixとprefix_sepパラメータで新しい列の名前をカスタマイズします。
< h2 class="example">例
import pandas as pd
# 1. DataFrame を作成する
df = pd.DataFrame({
'color': ['red', 'blue', 'green', 'red'],
'size': ['S', 'M', 'L', 'XL']
})
print("=== 元の DataFrame ===")
print(df)
# 2. prefix パラメータを使用してプレフィックスをカスタマイズする
result_prefix = pd.get_dummies(df, prefix=['color', 'size'])
print("\n=== カスタマイズしたプレフィックスを使用 ===")
print(result_prefix)
# 3. prefix_sep を使用して区切り文字をカスタマイズする
result_sep = pd.get_dummies(df, prefix=['color', 'size'], prefix_sep='-')
print("\n=== カスタム区切り文字 '-' を使用 ===")
print(result_sep)
# 1. DataFrame を作成する
df = pd.DataFrame({
'color': ['red', 'blue', 'green', 'red'],
'size': ['S', 'M', 'L', 'XL']
})
print("=== 元の DataFrame ===")
print(df)
# 2. prefix パラメータを使用してプレフィックスをカスタマイズする
result_prefix = pd.get_dummies(df, prefix=['color', 'size'])
print("\n=== カスタマイズしたプレフィックスを使用 ===")
print(result_prefix)
# 3. prefix_sep を使用して区切り文字をカスタマイズする
result_sep = pd.get_dummies(df, prefix=['color', 'size'], prefix_sep='-')
print("\n=== カスタム区切り文字 '-' を使用 ===")
print(result_sep)
実行結果の想定:
=== 原始 DataFrame === color size 0 red S 1 blue M 2 green L 3 red XL === 使用自定义前缀 === color_blue color_green color_red size_L size_M size_S size_XL 0 False False True False False True False 1 True False False False True False False 2 False True False True False False False 3 False False True False False False True === 使用自定义分隔符 '-' === color-blue color-green color-red size-L ...
コードの解説:
prefix=['color', 'size']異なる列に異なるプレフィックスを指定します。prefix_sep='-'デフォルトのアンダースコアをハイフンに変更すると、新しい列名はcolor-redという形式になります。
例4:欠損値の処理と drop_first パラメータ
例
import pandas as pd
import numpy as np
# 1. 欠損値を含むデータ
df = pd.DataFrame({
'color': ['red', 'blue', np.nan, 'red', 'green'],
'size': ['S', 'M', 'L', np.nan, 'XL']
})
print("=== 欠損値を含む DataFrame ===")
print(df)
# 2. デフォルトでは欠損値を処理しない
result_default = pd.get_dummies(df, columns=['color'])
print("\n=== デフォルトでは欠損値を処理しない ===")
print(result_default)
# 3. dummy_na=True で欠損値用の専用列を作成する
result_na = pd.get_dummies(df, columns=['color'], dummy_na=True)
print("\n=== dummy_na=True で欠損値用の列を作成 ===")
print(result_na)
# 4. drop_first=True で最初の列を削除して多重共線性を回避する
result_drop = pd.get_dummies(df, columns=['size'], drop_first=True)
print("\n=== drop_first=True で最初の列を削除 ===")
print(result_drop)
import numpy as np
# 1. 欠損値を含むデータ
df = pd.DataFrame({
'color': ['red', 'blue', np.nan, 'red', 'green'],
'size': ['S', 'M', 'L', np.nan, 'XL']
})
print("=== 欠損値を含む DataFrame ===")
print(df)
# 2. デフォルトでは欠損値を処理しない
result_default = pd.get_dummies(df, columns=['color'])
print("\n=== デフォルトでは欠損値を処理しない ===")
print(result_default)
# 3. dummy_na=True で欠損値用の専用列を作成する
result_na = pd.get_dummies(df, columns=['color'], dummy_na=True)
print("\n=== dummy_na=True で欠損値用の列を作成 ===")
print(result_na)
# 4. drop_first=True で最初の列を削除して多重共線性を回避する
result_drop = pd.get_dummies(df, columns=['size'], drop_first=True)
print("\n=== drop_first=True で最初の列を削除 ===")
print(result_drop)
実行結果の想定:
=== 包含缺失值的 DataFrame === color size 0 red S 1 blue M 2 NaN L 3 red NaN 4 green XL === 默认不处理缺失值 === size color_blue color_green color_red 0 S False False True 1 M True False False 2 L False False False 3 S False False True 4 XL False True False === dummy_na=True 为缺失值创建列 === size color_True color_blue color_green color_red 0 S False False False True 1 M False True False False 2 L True False False False 3 S False False False True 4 XL False False True False === drop_first=True 删除第一列 === color_blue color_green color_red 0 False False True 1 True False False 2 False False False 3 False False True 4 False True False
コードの解説:
dummy_na=True欠損値のための追加の列を作成します(この例では color_True 列として表示されます)。drop_first=True各グループの最初の列(例:size_M が削除される)を削除することで、線形モデルにおける多重共線性の問題を回避できます。
ヒント:ワンホットエンコーディングはデータの次元を増やします(各カテゴリに1列)。カテゴリ数が非常に多い場合、次元の呪いを引き起こす可能性があります。このような場合は、ラベルエンコーディング(
pd.factorize())や他のエンコーディング方法を検討できます。