Pandas pd.get_dummies() 関数

Pandas のよく使う関数


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)

実行結果の想定:

=== 原始 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

コードの解説:

  1. 元の Series には red、blue、green の3色が含まれます。
  2. ワンホットエンコーディング後、各色が1列になり、True/Falseでその行がそのカテゴリに属するかどうかを表します。
  3. 各行にはただ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)

実行結果の想定:

=== 原始 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)

実行結果の想定:

=== 原始 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)

実行結果の想定:

=== 包含缺失值的 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())や他のエンコーディング方法を検討できます。

Pandas のよく使う関数