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
- подсказка по размеру хэш-таблицы.codes
: целочисленный массив numpy.ndarray
, который является индексатором уникальных значений. uniques.take(codes)
будет иметь те же значения, что и values
.
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])