pd.unique
повертає унікальні значення з вхідного масиву або стовпця або індексу DataFrame.
Вхід до цієї функції повинен бути одномірним, тому кілька колонок потрібно буде об'єднати. Найпростіший спосіб - вибрати потрібні стовпці, а потім переглянути їх у згладженому масиві NumPy. Вся операція виглядає приблизно так:
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
Зауважте, що ravel()
це метод масиву, ніж повертає перегляд (якщо можливо) багатовимірного масиву. Аргумент 'K'
вказує на метод вирівнювання масиву в порядку, в якому елементи зберігаються в пам'яті (панди, як правило, зберігають базові масиви у 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'})