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.unique
w 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'})