pd.unique
renvoie les valeurs uniques d'un tableau d'entrée, d'une colonne ou d'un index DataFrame.
L'entrée de cette fonction doit être unidimensionnelle, de sorte que plusieurs colonnes devront être combinées. Le moyen le plus simple consiste à sélectionner les colonnes souhaitées, puis à afficher les valeurs dans un tableau NumPy aplati. L'ensemble de l'opération ressemble à ceci:
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
Notez qu'il ravel()
s'agit d'une méthode de tableau qui renvoie une vue (si possible) d'un tableau multidimensionnel. L'argument 'K'
indique à la méthode d'aplatir le tableau dans l'ordre dans lequel les éléments sont stockés en mémoire (les pandas stockent généralement les tableaux sous-jacents dans l' ordre contigu à Fortran ; les colonnes avant les lignes). Cela peut être beaucoup plus rapide que d'utiliser l'ordre par défaut «C» de la méthode.
Une autre méthode consiste à sélectionner les colonnes et à les transmettre à np.unique
:
>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)
Il n'est pas nécessaire d'utiliser ravel()
ici car la méthode gère les tableaux multidimensionnels. Même dans ce cas, cela sera probablement plus lent que pd.unique
car il utilise un algorithme basé sur le tri plutôt qu'une table de hachage pour identifier des valeurs uniques.
La différence de vitesse est significative pour les DataFrames plus volumineux (surtout s'il n'y a qu'une poignée de valeurs uniques):
>>> 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'})