pd.unique
devuelve los valores únicos de una matriz de entrada, o columna o índice de DataFrame.
La entrada a esta función debe ser unidimensional, por lo que será necesario combinar varias columnas. La forma más simple es seleccionar las columnas que desee y luego ver los valores en una matriz NumPy aplanada. Toda la operación se ve así:
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
Tenga en cuenta que ravel()
es un método de matriz que devuelve una vista (si es posible) de una matriz multidimensional. El argumento 'K'
le dice al método que aplaste la matriz en el orden en que los elementos se almacenan en la memoria (los pandas generalmente almacenan las matrices subyacentes en orden contiguo a Fortran ; columnas antes de filas). Esto puede ser significativamente más rápido que usar el orden predeterminado 'C' del método.
Una forma alternativa es seleccionar las columnas y pasarlas a np.unique
:
>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)
No es necesario usar ravel()
aquí ya que el método maneja matrices multidimensionales. Aun así, es probable que sea más lento que pd.unique
cuando utiliza un algoritmo basado en clasificación en lugar de una tabla hash para identificar valores únicos.
La diferencia de velocidad es significativa para los marcos de datos más grandes (especialmente si solo hay un puñado de valores únicos):
>>> 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'})