pd.unique
retorna os valores exclusivos de uma matriz de entrada, coluna ou índice DataFrame.
A entrada para esta função precisa ser unidimensional, portanto, várias colunas precisarão ser combinadas. A maneira mais simples é selecionar as colunas desejadas e exibir os valores em uma matriz NumPy achatada. Toda a operação é assim:
>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K'))
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object)
Observe que ravel()
é um método de matriz que retorna uma visualização (se possível) de uma matriz multidimensional. O argumento 'K'
diz ao método para nivelar a matriz na ordem em que os elementos são armazenados na memória (os pandas normalmente armazenam matrizes subjacentes na ordem contígua ao Fortran ; colunas antes das linhas). Isso pode ser significativamente mais rápido do que usar a ordem 'C' padrão do método.
Uma maneira alternativa é selecionar as colunas e passá-las para np.unique
:
>>> np.unique(df[['Col1', 'Col2']].values)
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object)
Não há necessidade de usar ravel()
aqui, pois o método manipula matrizes multidimensionais. Mesmo assim, é provável que isso seja mais lento do que pd.unique
quando usa um algoritmo baseado em classificação, em vez de uma hashtable para identificar valores únicos.
A diferença de velocidade é significativa para DataFrames maiores (especialmente se houver apenas alguns valores exclusivos):
>>> 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'})