pd.unique
возвращает уникальные значения из входного массива, столбца или индекса DataFrame.
Входные данные для этой функции должны быть одномерными, поэтому необходимо объединить несколько столбцов. Самый простой способ - выбрать нужные столбцы, а затем просмотреть значения в упорядоченном массиве NumPy. Вся операция выглядит так:
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
Обратите внимание, что ravel()
это метод массива, который возвращает представление (если возможно) многомерного массива. Аргумент 'K'
указывает методу сглаживать массив в том порядке, в котором элементы хранятся в памяти (pandas обычно хранит базовые массивы в непрерывном порядке Fortran ; столбцы перед строками). Это может быть значительно быстрее, чем использование порядка «C» по умолчанию.
Альтернативный способ - выбрать столбцы и передать их np.unique
:
>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)
В этом нет необходимости, ravel()
поскольку метод обрабатывает многомерные массивы. Даже в этом случае это, вероятно, будет медленнее, чем pd.unique
при использовании алгоритма на основе сортировки, а не хеш-таблицы для определения уникальных значений.
Разница в скорости значительна для больших DataFrames (особенно, если есть только несколько уникальных значений):
>>> df1 = pd.concat([df]*100000, ignore_index=True) # DataFrame with 500000 rows
>>> %timeit np.unique(df1[['Col1', 'Col2']].values)
1 loop, best of 3: 1.12 s per loop
>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel('K'))
10 loops, best of 3: 38.9 ms per loop
>>> %timeit pd.unique(df1[['Col1', 'Col2']].values.ravel()) # ravel using C order
10 loops, best of 3: 49.9 ms per loop
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})