【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)
このコードでは、prefix
と prefix_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)
この方法は、複雑な変換ロジックが必要な場合に役立ちますが、コードの保守が難しくなる可能性があります。
利点
- コードを再利用しやすい
- 複雑な変換ロジックに対応できる
欠点
- テストが必要
- コードの保守が難しくなる可能性がある
どの代替方法が適切かは、データの複雑さ、変換ロジック、および個人的な好みによって異なります。
- シンプルなケースであれば、手動で列を