pd.factorize — кодирование категорий в числа в pandas

pd.factorize кодирует категории в целые числа (label encoding) и возвращает кортеж (codes, uniques): массив кодов и список уникальных значений. Нужен для компактного хранения, группировок по целочисленным ключам и подготовки категориальных признаков к моделям. NaN по умолчанию получает код -1.

Синтаксис

pd.factorize(values, sort=False, use_na_sentinel=True)

Примеры использования

Пример 1: Базовое кодирование в порядке появления

codes, uniques = pd.factorize(df['channel'])
print(codes)
print(list(uniques))

Результат:

[0 1 0 2]
['organic', 'paid', 'email']

Пример 2: sort=True — коды по отсортированным категориям

codes, uniques = pd.factorize(df['channel'], sort=True)
print(codes)
print(list(uniques))

Результат:

[1 2 1 0]
['email', 'organic', 'paid']

Пример 3: NaN получает код -1

codes, uniques = pd.factorize(pd.Series(['organic', None, 'paid']))
codes

Результат:

array([ 0, -1,  1])
Порешать Python-задачи в тренажёре →

Типичная ошибка

Коды идут в порядке первого появления значений, а не отсортированно (sort=True меняет это). NaN/None по умолчанию кодируется сентинелом -1 (use_na_sentinel) и не попадает в uniques. Возвращается кортеж (codes: ndarray, uniques: Index) — его нужно распаковать. Это не то же самое, что get_dummies (one-hot).

Где спрашивают на собеседовании

Быстрое label-кодирование категорий для tree-моделей, компактного хранения и группировок по целым ключам. Спрашивают отличие от get_dummies (one-hot) и pd.Categorical, а также как обрабатывается NaN (-1).

FAQ: частые вопросы про factorize

Чем factorize отличается от get_dummies?

factorize кодирует категории в ОДНУ целочисленную колонку (label encoding): organic→0, paid→1. get_dummies разворачивает значения в несколько бинарных колонок (one-hot). factorize компактнее и подходит для tree-моделей, а one-hot — для линейных, где порядок кодов не должен нести смысл.

Как factorize обрабатывает пропуски?

NaN/None по умолчанию кодируется отдельным сентинелом -1 и не включается в uniques (параметр use_na_sentinel=True). Если нужно, чтобы NaN стал обычной категорией со своим кодом, выставьте use_na_sentinel=False.

Почему коды идут не по алфавиту?

По умолчанию factorize нумерует категории в порядке их первого появления в данных, а не по сортировке. Передайте sort=True, чтобы uniques были отсортированы, а коды соответствовали этому порядку.

Задачи в тренажёре по теме

Вопросы с собеседований по теме

Смежные темы Python

Pandas: основы · Pandas groupby

Другие функции pandas

groupby · merge · pivot_table · apply · value_counts · drop_duplicates

Открыть Python-тренажёр (556 задач) →