pd.unique zwraca unikatowe wartości z tablicy wejściowej lub kolumny lub indeksu DataFrame.
Dane wejściowe tej funkcji muszą być jednowymiarowe, więc trzeba będzie połączyć wiele kolumn. Najprostszym sposobem jest wybranie żądanych kolumn, a następnie wyświetlenie wartości w spłaszczonej tablicy NumPy. Cała operacja wygląda tak:
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
Zauważ, że ravel()jest to metoda tablicowa, która zwraca widok (jeśli to możliwe) tablicy wielowymiarowej. Argument 'K'mówi metodzie, aby spłaszczyła tablicę w kolejności, w jakiej elementy są przechowywane w pamięci (pandy zazwyczaj przechowują podstawowe tablice w kolejności ciągłej w języku Fortran ; kolumny przed wierszami). Może to być znacznie szybsze niż użycie domyślnej kolejności „C” metody.
Alternatywnym sposobem jest wybranie kolumn i przekazanie ich do np.unique:
>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)
Nie ma potrzeby używania ravel()tutaj, ponieważ metoda obsługuje tablice wielowymiarowe. Mimo to prawdopodobnie będzie to wolniejsze niż pd.uniquew przypadku użycia algorytmu opartego na sortowaniu zamiast tablicy hashy do identyfikacji unikalnych wartości.
Różnica w szybkości jest znacząca w przypadku większych ramek DataFrame (zwłaszcza jeśli istnieje tylko kilka unikalnych wartości):
>>> df1 = pd.concat([df]*100000, ignore_index=True)
>>> %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())
10 loops, best of 3: 49.9 ms per loop
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})