df = pd.DataFrame({'Col1': ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'],
'Col2': ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'],
'Col3': np.random.random(5)})
Quelle est la meilleure façon de renvoyer les valeurs uniques de «Col1» et «Col2»?
La sortie souhaitée est
'Bob', 'Joe', 'Bill', 'Mary', 'Steve'
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})
Réponses:
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:
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
: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 quepd.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):
la source
pd.DataFrame(unique_values)
. Il n'y a pas de bon moyen de récupérer directement un DataFrame.J'ai configuré un
DataFrame
avec quelques chaînes simples dans ses colonnes:Vous pouvez concaténer les colonnes qui vous intéressent et appeler la
unique
fonction:la source
Ou:
la source
Une solution mise à jour utilisant numpy v1.13 + nécessite de spécifier l'axe dans np.unique si vous utilisez plusieurs colonnes, sinon le tableau est implicitement aplati.
Ce changement a été introduit en novembre 2016: https://github.com/numpy/numpy/commit/1f764dbff7c496d6636dc0430f083ada9ff4e4be
la source
Non-
pandas
solution: en utilisant set ().Production:
la source
pour ceux d'entre nous qui aiment toutes les choses pandas, appliquent et bien sûr les fonctions lambda:
la source
voici une autre façon
la source
La sortie sera ['Mary', 'Joe', 'Steve', 'Bob', 'Bill']
la source