Pandas get_dummies (one-hot encoding)

pd.get_dummies превращает категориальный столбец в набор бинарных «индикаторов»: для каждой категории создаётся отдельный столбец 0/1. Это стандартный приём для подготовки данных к моделям машинного обучения, которые не работают со строковыми признаками напрямую.

Когда использовать

  • Подготовка фичей перед обучением модели.

  • Кодирование статусов «ok/fail/idle».

  • Раскрытие столбца «модель устройства» в отдельные бинарные признаки.

Пример 1. Базовое использование

import pandas as pd

s = pd.Series(["A", "B", "A", "C"])
print(pd.get_dummies(s))

Output:

       A      B      C
0   True  False  False
1  False   True  False
2   True  False  False
3  False  False   True

Пример 2. На DataFrame

import pandas as pd

df = pd.DataFrame({
    "device": ["bot1", "bot2", "bot1"],
    "status": ["ok", "fail", "ok"],
    "v": [10, 20, 30],
})
print(pd.get_dummies(df, columns=["device", "status"]))

Output:

    v  device_bot1  device_bot2  status_fail  status_ok
0  10         True        False        False       True
1  20        False         True         True      False
2  30         True        False        False       True

Пример 3. drop_first

В линейных моделях избегают коллинеарности — удаляют один столбец:

import pandas as pd

s = pd.Series(["A", "B", "C"])
print(pd.get_dummies(s, drop_first=True))

Output:

       B      C
0  False  False
1   True  False
2  False   True

Пример 4. Целочисленный вывод

import pandas as pd

s = pd.Series(["A", "B"])
print(pd.get_dummies(s, dtype=int))

Output:

   A  B
0  1  0
1  0  1

Пример 5. Префикс

import pandas as pd

s = pd.Series(["red", "green"])
print(pd.get_dummies(s, prefix="color"))

Output:

   color_green  color_red
0        False       True
1         True      False

Пример 6. dummy_na

import pandas as pd
import numpy as np

s = pd.Series(["A", "B", np.nan])
print(pd.get_dummies(s, dummy_na=True))

Output:

       A      B    NaN
0   True  False  False
1  False   True  False
2  False  False   True

Пример 7. Обратное преобразование

import pandas as pd

df = pd.DataFrame({"A": [1, 0, 0], "B": [0, 1, 0], "C": [0, 0, 1]})
print(df.idxmax(axis=1))

Output:

0    A
1    B
2    C
dtype: object

Подводные камни

  • Большое число уникальных значений → «взрыв» столбцов. Сначала ограничьте категории.

  • Категории, отсутствующие в тренировке, не появятся в тесте — фиксируйте словарь категорий заранее.

  • True/False нельзя напрямую усреднять без приведения в int.

См. также

Примечание

Лицензия и источники

Техническое описание адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.