pandas valores únicos columnas múltiples

df = pd.DataFrame({'Col1': ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'], 'Col2': ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'], 'Col3': np.random.random(5)}) 

¿Cuál es la mejor manera de devolver los valores únicos de ‘Col1’ y ‘Col2’?

La salida deseada es

 'Bob', 'Joe', 'Bill', 'Mary', 'Steve' 

Related of "pandas valores únicos columnas múltiples"

pd.unique devuelve los valores únicos de una matriz de entrada, o una 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 desea 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 para aplanar la matriz en el orden en que se almacenan los elementos en la memoria (los pandas generalmente almacenan las matrices subyacentes en orden contiguo de Fortran ; columnas antes de las 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 la clasificación en lugar de una tabla hash para identificar valores únicos.

La diferencia en la velocidad es significativa para los 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 ab 0 ag 1 bh 2 da 3 ee 

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

 >>> 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) 

Solución no pandas : utilizando set ().

 import pandas as pd import numpy as np df = pd.DataFrame({'Col1' : ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'], 'Col2' : ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'], 'Col3' : np.random.random(5)}) print df print set(df.Col1.append(df.Col2).values) 

Salida:

  Col1 Col2 Col3 0 Bob Joe 0.201079 1 Joe Steve 0.703279 2 Bill Bob 0.722724 3 Mary Bob 0.093912 4 Joe Steve 0.766027 set(['Steve', 'Bob', 'Bill', 'Joe', 'Mary']) 

Una solución actualizada que usa numpy v1.13 + requiere que se especifique el eje en np.unique si se usan varias columnas, de lo contrario, la matriz se aplana implícitamente.

 import numpy as np np.unique(df[['col1', 'col2']], axis=0) 

Este cambio se introdujo en noviembre de 2016: https://github.com/numpy/numpy/commit/1f764dbff7c496d6636dc0430f083ada9ff4e4be

para aquellos de nosotros que amamos todas las cosas pandas, se aplican, y por supuesto las funciones lambda:

 df['Col3'] = df[['Col1', 'Col2']].apply(lambda x: ''.join(x), axis=1) 
 np.unique(df.values.flatten()) 
 list(set(df[['Col1', 'Col2']].as_matrix().reshape((1,-1)).tolist()[0])) 

La salida será [‘Mary’, ‘Joe’, ‘Steve’, ‘Bob’, ‘Bill’]

aquí hay otra manera

 import numpy as np set(np.concatenate(df.values))