pd.unique
Gibt die eindeutigen Werte aus einem Eingabearray oder einer DataFrame-Spalte oder einem Index zurück.
Die Eingabe für diese Funktion muss eindimensional sein, sodass mehrere Spalten kombiniert werden müssen. Am einfachsten ist es, die gewünschten Spalten auszuwählen und dann die Werte in einem abgeflachten NumPy-Array anzuzeigen. Die ganze Operation sieht so aus:
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
Beachten Sie, dass dies ravel()
eine Array-Methode ist, die (wenn möglich) eine Ansicht eines mehrdimensionalen Arrays zurückgibt. Das Argument 'K'
weist die Methode an, das Array in der Reihenfolge zu reduzieren, in der die Elemente im Speicher gespeichert sind (Pandas speichert normalerweise zugrunde liegende Arrays in fortlaufender Fortran-Reihenfolge ; Spalten vor Zeilen). Dies kann erheblich schneller sein als bei Verwendung der Standardreihenfolge 'C' der Methode.
Eine alternative Möglichkeit besteht darin, die Spalten auszuwählen und an folgende Adresse zu übergeben np.unique
:
>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)
Hier ist keine Verwendung erforderlich, ravel()
da die Methode mehrdimensionale Arrays verarbeitet. Dies ist jedoch wahrscheinlich langsamer als pd.unique
die Verwendung eines sortierungsbasierten Algorithmus anstelle einer Hashtabelle zur Identifizierung eindeutiger Werte.
Der Geschwindigkeitsunterschied ist bei größeren DataFrames erheblich (insbesondere wenn nur eine Handvoll eindeutiger Werte vorhanden sind):
>>> 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'})