Функция Pandas pd.get_dummies()
Часто используемые функции 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
Пример
# 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
Пояснение к коду:
- Исходная Series содержит три цвета: red, blue, green.
- После one-hot кодирования каждый цвет становится столбцом, используя
True/Falseчтобы указать, принадлежит ли строка к этой категории. - Каждая строка имеет ровно одну
True, соответствующую исходному значению цвета.
Пример 2: Кодирование определенных столбцов DataFrame
В анализе данных часто требуется закодировать только определенные категориальные столбцы, оставляя числовые столбцы без изменений.
Пример
# 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параметр для настройки имён новых столбцов.
# 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 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()) или другие методы кодирования.