Сообщить об ошибке.

Функция factorize() модуля pandas в Python

Получение числового представления элементов массива

Синтаксис:

import pandas

codes, uniques = pandas.factorize(values, sort=False, 
                                     use_na_sentinel=True, size_hint=None)

Параметры:

  • values - одномерная последовательность. Последовательности, не являющиеся объектами pandas приводятся к типу numpy.ndarrays.
  • sort=False - сортирует уникальные коды и перемешивает их, чтобы сохранить взаимосвязь.
  • use_na_sentinel=True - если True, то для значений NaN будет использоваться значение -1. Если False, то значения NaN будут закодированы как неотрицательные целые числа и не приведет к удалению NaN из уникальных значений.
  • size_hint=None - подсказка по размеру хэш-таблицы.

Возвращает два значения:

  1. codes: целочисленный массив numpy.ndarray, который является индексатором уникальных значений. uniques.take(codes) будет иметь те же значения, что и values.

  2. uniques: если значения являются pandas.Categorical, то уникальные значения являются pandas.Categorical. Если значения являются каким-либо другим объектом pandas, возвращается pandas.Index. В противном случае возвращается 1D numpy.ndarray.

Описание pandas.factorize()

Функция factorize() модуля pandas кодирует объект с элементами values как перечисляемый тип или категориальную переменную.

Этот метод полезен для получения числового представления массива, когда все, что имеет значение, идентифицирует различные значения.

Функция factorize() также доступна в качестве методов Series.factorize() и Index.factorize(). Поведение методов и принимаемые аргументы аналогичны функции, за исключением того, что методы не принимают аргумент values, так как сами являются источником значений.

Функция factorize() кодирует одномерные значения в целочисленные метки. Пропущенные значения NA кодируются как -1.

>>> import numpy as np
>>> import pandas as pd
>>> x = pd.Series(["A", "A", np.nan, "B", 3.14, np.inf])
>>> x
# 0       A
# 1       A
# 2     NaN
# 3       B
# 4    3.14
# 5     inf
# dtype: object

>>> labels, uniques = pd.factorize(x)
>>> labels
# array([ 0,  0, -1,  1,  2,  3])
>>> uniques
# Index(['A', 'B', 3.14, inf], dtype='object')

Класс pandas.Categorical() аналогично будет кодировать одномерные значения для дальнейших операций c категориями

>>> pd.Categorical(x)
# ['A', 'A', NaN, 'B', 3.14, inf]
# Categories (4, object): [3.14, inf, 'A', 'B']

Примеры использования pandas.factorize():

Все примеры показывают использование функции (pd.factorize()). Результаты будут идентичны дляSeries.factorize()`.

>>> codes, uniques = pd.factorize(np.array(['b', 'b', 'a', 'c', 'b'], dtype="O"))
>>> codes
# array([0, 0, 1, 2, 0])
>>> uniques
# array(['b', 'a', 'c'], dtype=object)

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

>>> c, u = pd.factorize(np.array(['b', 'b', 'a', 'c', 'b'], dtype="O"), sort=True)
>>> c
# array([1, 1, 0, 2, 1])
>>> u
# array(['a', 'b', 'c'], dtype=object)

Когда use_na_sentinel=True (по умолчанию), то пропущенные значения NA указываются в codes с контрольным значением -1, при этом пропущенные значения не включаются в uniques.

>>> c, u = pd.factorize(np.array(['b', None, 'a', 'c', 'b'], dtype="O"))
>>> c
# array([ 0, -1,  1,  2,  0])
>>> u
# array(['b', 'a', 'c'], dtype=object)

При факторизации объектов pandas, тип уникальных объектов uniques будет отличаться. Для категориальных значений возвращается значение pandas.Categories.

>>> cat = pd.Categorical(['a', 'a', 'c'], categories=['a', 'b', 'c'])
>>> codes, uniques = pd.factorize(cat)
>>> codes
# array([0, 0, 1])
>>> uniques
# ['a', 'c']
# Categories (3, object): ['a', 'b', 'c']

>>> uniques.categories
# Index(['a', 'b', 'c'], dtype='object')

Обратите внимание, что 'b' находится в uniques.categories, несмотря на отсутствие в cat.values.

Для всех остальных объектов pandas возвращается индекс соответствующего типа.

>>> cat = pd.Series(['a', 'a', 'c'])
>>> codes, uniques = pd.factorize(cat)
>>> codes
# array([0, 0, 1])
>>> uniques
# Index(['a', 'c'], dtype='object')

Если NaN находится в значениях, при этом NaN нужно включить в уникальные значения, то этого можно добиться, установив use_na_sentinel=False.

>>> values = np.array([1, 2, 1, np.nan])
>>> codes, uniques = pd.factorize(values)
>>> codes
# array([ 0,  1,  0, -1])
>>> uniques
# array([1., 2.])

>>> codes, uniques = pd.factorize(values, use_na_sentinel=False)
>>> codes
# array([0, 1, 0, 2])
>>> uniques
# array([ 1.,  2., nan])