【Pandas】ダミー変数から元のカテゴリカル変数へ変換:pandas.from_dummies徹底解説


具体的な使用方法

import pandas as pd

# ダミー変数を含むデータフレームを作成
data = pd.DataFrame({'A': ['Dog', 'Cat', 'Rat', 'Dog'],
                     'B': ['Small', 'Medium', 'Large', 'Small']})
dummy_data = pd.get_dummies(data)

# 'A' 列のダミー変数から元のカテゴリカル変数へ変換
original_data = pd.from_dummies(dummy_data[['A_Cat', 'A_Dog', 'A_Rat']])
print(original_data)

このコードを実行すると、以下の出力が得られます。

   A
0  Dog
1  Cat
2  Rat
3  Dog

上記の例では、A 列のダミー変数 (A_Cat, A_Dog, A_Rat) を pandas.from_dummies 関数に渡すことで、元のカテゴリカル値 (Dog, Cat, Rat) を含む新しい A 列が作成されています。

  • drop_first: 最初のダミー変数を削除するかどうか(デフォルトは False
  • sep: カテゴリカル値と接頭辞を区切る文字列(デフォルトは '_'"
  • columns: 元に戻したいカテゴリカル変数に対応するダミー変数の列名
  • data: ダミー変数を含むデータフレーム
  • 最初のダミー変数を削除するかどうかを drop_first 引数で設定することができます。
  • カテゴリカル値と接頭辞の区切り文字を sep 引数で変更することができます。
  • ダミー変数から元のカテゴリカル変数へ変換する際には、data 引数にダミー変数のみを含むデータフレームを、columns 引数には元のカテゴリカル変数に対応するダミー変数の列名を指定する必要があります。
  • pandas.from_dummies 関数は、カテゴリカル変数をダミー変数に変換する pandas.get_dummies 関数の逆変換機能として機能します。


例 1:シンプルなダミー変数から元のカテゴリカル変数へ変換

import pandas as pd

# ダミー変数を含むデータフレームを作成
data = pd.DataFrame({'A': ['Dog', 'Cat', 'Rat', 'Dog'],
                     'B': ['Small', 'Medium', 'Large', 'Small']})
dummy_data = pd.get_dummies(data)

# 'A' 列のダミー変数から元のカテゴリカル変数へ変換
original_data = pd.from_dummies(dummy_data[['A_Cat', 'A_Dog', 'A_Rat']])
print(original_data)

このコードは、冒頭の説明で使用したコードと同じです。ここでは、単純なダミー変数データフレームから元のカテゴリカル変数へ変換する方法を示しています。

例 2:接頭辞と区切り文字を指定して元のカテゴリカル変数へ変換

import pandas as pd

# ダミー変数を含むデータフレームを作成
data = pd.DataFrame({'A': ['Dog', 'Cat', 'Rat', 'Dog'],
                     'B': ['Small', 'Medium', 'Large', 'Small']})
dummy_data = pd.get_dummies(data, prefix='animal_', prefix_sep='-')

# 'A' 列のダミー変数から元のカテゴリカル変数へ変換
original_data = pd.from_dummies(dummy_data[['animal_-Cat', 'animal_-Dog', 'animal_-Rat']], sep='-')
print(original_data)

このコードでは、prefixprefix_sep 引数を pd.get_dummies 関数に渡すことで、ダミー変数の列名に接頭辞 'animal_' と区切り文字 '-' を指定しています。その後、pandas.from_dummies 関数に sep 引数で '-' を渡し、ダミー変数から元のカテゴリカル変数へ変換しています。

import pandas as pd

# ダミー変数を含むデータフレームを作成
data = pd.DataFrame({'A': ['Dog', 'Cat', 'Rat', 'Dog'],
                     'B': ['Small', 'Medium', 'Large', 'Small']})
dummy_data = pd.get_dummies(data)

# 'A' 列のダミー変数から最初のダミー変数を削除して元のカテゴリカル変数へ変換
original_data = pd.from_dummies(dummy_data[['A_Cat', 'A_Dog', 'A_Rat']], drop_first=True)
print(original_data)

このコードでは、drop_first 引数を True に設定することで、pandas.from_dummies 関数が最初のダミー変数を削除するようにしています。つまり、元のカテゴリカル変数の値がすべて 1 になる列が作成されます。



手動で列を操作する

最も基本的な方法は、手動で列を操作して元のカテゴリカル変数を作成することです。例えば、以下のコードは pandas.Series オブジェクトに対して操作を行い、ダミー変数から元のカテゴリカル変数へ変換します。

import pandas as pd

# ダミー変数を含む Series オブジェクトを作成
dummy_series = pd.Series([1, 0, 0, 1], name='A')

# 手動で列を操作して元のカテゴリカル変数を作成
original_series = dummy_series.idxmax()
print(original_series)

この方法は、シンプルなケースであれば有効ですが、複雑なデータフレームや複数のダミー変数列を扱う場合は、煩雑になりがちです。

利点

  • 外部ライブラリの必要がない
  • シンプルなケースで使いやすい

欠点

  • コードが冗長になる可能性がある
  • 複雑なケースでは煩雑になる

numpy.where を使用する

numpy.where 関数を使用して、ダミー変数の値に基づいて元のカテゴリカル値を割り当てることもできます。例えば、以下のコードは numpy.where 関数を使用して、ダミー変数データフレームから元のカテゴリカル変数列を作成します。

import pandas as pd
import numpy as np

# ダミー変数を含むデータフレームを作成
data = pd.DataFrame({'A_Cat': [1, 0, 0, 1],
                     'A_Dog': [0, 1, 0, 0],
                     'A_Rat': [0, 0, 1, 0]})

# numpy.where を使用して元のカテゴリカル変数列を作成
original_data = np.where(data[['A_Cat', 'A_Dog', 'A_Rat']].max(axis=1) == 1,
                       data.columns[data[['A_Cat', 'A_Dog', 'A_Rat']].idxmax(axis=1)],
                       'None')
print(original_data)

この方法は、pandas.from_dummies 関数よりも柔軟性がありますが、コードが複雑になりがちです。

利点

  • 複雑な条件にも対応できる
  • 柔軟性が高い

欠点

  • 読みづらいコードになる可能性がある
  • コードが複雑になる可能性がある

カスタム関数を使用する

独自の要件を満たすために、カスタム関数を作成することもできます。例えば、以下のコードはカスタム関数を使用して、ダミー変数データフレームから元のカテゴリカル変数列を作成します。

import pandas as pd

def convert_to_original(data):
    """ダミー変数データフレームから元のカテゴリカル変数列を作成する関数

    Args:
        data (pandas.DataFrame): ダミー変数を含むデータフレーム

    Returns:
        pandas.Series: 元のカテゴリカル値を含む Series オブジェクト
    """
    max_values = data.max(axis=1)
    original_values = max_values.idxmax(axis=1)
    for i in range(len(original_values)):
        if max_values.iloc[i] == 0:
            original_values.iloc[i] = 'None'
    return original_values

# ダミー変数を含むデータフレームを作成
data = pd.DataFrame({'A_Cat': [1, 0, 0, 1],
                     'A_Dog': [0, 1, 0, 0],
                     'A_Rat': [0, 0, 1, 0]})

# カスタム関数を使用して元のカテゴリカル変数列を作成
original_data = convert_to_original(data)
print(original_data)

この方法は、複雑な変換ロジックが必要な場合に役立ちますが、コードの保守が難しくなる可能性があります。

利点

  • コードを再利用しやすい
  • 複雑な変換ロジックに対応できる

欠点

  • テストが必要
  • コードの保守が難しくなる可能性がある

どの代替方法が適切かは、データの複雑さ、変換ロジック、および個人的な好みによって異なります。

  • シンプルなケースであれば、手動で列を