Функция Pandas pd.get_dummies()

Pandas 通用函数Часто используемые функции Pandas


pd.get_dummies()Это функция библиотеки Pandas, используемая дляone-hot-кодирования категориальных переменных. Она преобразует категориальные переменные в бинарные (0/1) столбцы, при этом каждая категория соответствует столбцу.

One-hot-кодирование — распространённая техника предобработки в машинном обучении, поскольку большинство алгоритмов не могут напрямую работать с категориальными данными и нуждаются в их преобразовании в числовую форму.

Пояснение слова: get_dummiesЗдесь "dummy" означает "фиктивная переменная", то есть бинарные переменные, используемые в статистике и эконометрике для представления категориальных переменных.


Базовый синтаксис и параметры

pd.get_dummies()Это функция верхнего уровня в библиотеке Pandas, используемая для преобразования категориальных переменных в формат one-hot-кодирования.

Формат синтаксиса

pd.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, drop_first=False, dtype=None)

Описание параметра

  • Параметр: data
    • Тип: Series, DataFrame или объект, подобный массиву.
    • Описание: данные, которые нужно подвергнуть one-hot-кодированию. Обычно Series или DataFrame, содержащий категориальные переменные.
  • Параметр: prefix
    • Тип: строка, список строк или словарь.
    • Описание: префикс для создаваемых новых имён столбцов. Если не указан, в качестве префикса используются исходные имена столбцов.
  • Параметр: prefix_sep
    • Тип: строка.
    • Описание: Разделитель между префиксом и именем категории. По умолчанию — подчеркивание'_'。
  • Параметр: dummy_na
    • Тип: Boolean.
    • Описание: ЕслиTrue, также создаёт отдельный столбец для пропущенных значений (NaN). По умолчанию —False。
  • Параметр: columns
    • Тип: List или None.
    • Описание: Имена столбцов для кодирования. Если не указано, кодируются все столбцы типа object, category или boolean.
  • Параметр: drop_first
    • Тип: Boolean.
    • Описание: ЕслиTrue, он удалит первый столбец каждой категориальной переменной, чтобы избежать мультиколлинеарности. В моделях, таких как логистическая регрессия, это позволяет избежать ловушки фиктивных переменных. По умолчанию —False。

Описание функций

  • Возвращаемое значение: Возвращает DataFrame, где каждый столбец соответствует категории, а значения равны 0 или 1.
  • Эффект: Преобразует категориальные переменные в числовые бинарные столбцы, упрощая обработку алгоритмами машинного обучения.

Примеры

Давайте с помощью серии примеров от простых к сложным основательно освоимpd.get_dummies()использование pd.get_dummies().

Пример 1: Базовое использование — one-hot-кодирование Series

Пример

import pandas as pd

# 1. Создайте Series, содержащий категориальные переменные
colors = pd.Series(['red', 'blue', 'green', 'red', 'green', 'blue'])

print("=== Исходная Series ===")
print(colors)

# 2. Используйте pd.get_dummies() для one-hot кодирования
result = pd.get_dummies(colors)
print("\n"=== результат one-hot кодирования 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.
  2. После one-hot кодирования каждый цвет становится столбцом, используяTrue/Falseчтобы указать, принадлежит ли строка к этой категории.
  3. Каждая строка имеет ровно однуTrue, соответствующую исходному значению цвета.

Пример 2: Кодирование определенных столбцов DataFrame

В анализе данных часто требуется закодировать только определенные категориальные столбцы, оставляя числовые столбцы без изменений.

Пример

import pandas as pd

# 1. Создайте DataFrame, содержащий числовые и категориальные переменные
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie', 'Diana'],
    'age': [25, 30, 35, 28],
    'city': ['Пекин', 'Шанхай', 'Пекин', 'Guangzhou'],
    'department': ['Sales', 'Engineering', 'Sales', 'HR']
})

print("=== Исходный DataFrame ===")
print(df)

# 2. Выполнить one-hot-кодирование для указанных категориальных столбцов
result = pd.get_dummies(df, columns=['city', 'department'])
print("\n"=== One-hot-кодирование для столбцов 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 удаляется) может помочь избежать проблем мультиколлинеарности в линейных моделях.

Совет:One-hot-кодирование увеличивает размерность данных (один столбец на категорию). Если число категорий очень велико, это может привести к проклятию размерности. В таких случаях можно рассмотреть использование кодирования меток (pd.factorize()) или другие методы кодирования.

Pandas 常用函数Часто используемые функции Pandas