Saltar al contenido

pandas valores únicos múltiples columnas

Solución:

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 sencilla 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 aplana la matriz en el orden en que los elementos se almacenan en la memoria (los pandas suelen almacenar matrices subyacentes en orden contiguo a Fortran; columnas antes de filas). Esto puede ser significativamente más rápido que usar el orden ‘C’ predeterminado 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 hay necesidad de usar ravel() aquí, ya que el método maneja matrices multidimensionales. Aun así, es probable que esto sea más lento que pd.unique ya que utiliza un algoritmo basado en clasificación en lugar de una tabla hash para identificar valores únicos.

La diferencia de velocidad es significativa para DataFrames 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

He configurado un DataFrame con algunas cadenas simples en sus columnas:

>>> df
   a  b
0  a  g
1  b  h
2  d  a
3  e  e

Puede concatenar las columnas que le interesan y llamar unique función:

>>> pandas.concat([df['a'], df['b']]).unique()
array(['a', 'b', 'd', 'e', 'g', 'h'], dtype=object)

In [5]: set(df.Col1).union(set(df.Col2))
Out[5]: {'Bill', 'Bob', 'Joe', 'Mary', 'Steve'}

O:

set(df.Col1) | set(df.Col2)
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *