pd.unique
restituisce i valori univoci da un array di input o da una colonna o un indice DataFrame.
L'input per questa funzione deve essere monodimensionale, quindi è necessario combinare più colonne. Il modo più semplice è selezionare le colonne desiderate e quindi visualizzare i valori in un array NumPy appiattito. L'intera operazione è simile a questa:
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
Si noti che ravel()
è un metodo array che restituisce una vista (se possibile) di un array multidimensionale. L'argomento 'K'
dice al metodo di appiattire l'array nell'ordine in cui gli elementi sono memorizzati (i panda in genere memorizzano gli array sottostanti in ordine Fortran-contiguo ; colonne prima delle righe). Questo può essere significativamente più veloce rispetto all'utilizzo dell'ordine 'C' predefinito del metodo.
Un modo alternativo è selezionare le colonne e passarle a np.unique
:
>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)
Non è necessario utilizzarlo ravel()
qui poiché il metodo gestisce array multidimensionali. Anche così, questo sarà probabilmente più lento dipd.unique
a quando utilizza un algoritmo basato sull'ordinamento anziché una tabella hash per identificare valori univoci.
La differenza di velocità è significativa per DataFrame più grandi (specialmente se ci sono solo una manciata di valori univoci):
>>> 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'})