2014-11-17 3 views
45
df = pd.DataFrame({'Col1': ['Bob', 'Joe', 'Bill', 'Mary', 'Joe'], 
        'Col2': ['Joe', 'Steve', 'Bob', 'Bob', 'Steve'], 
        'Col3': np.random.random(5)}) 

'Col1'과 'Col2'의 고유 값을 반환하는 가장 좋은 방법은 무엇입니까? 하여 설정()팬다 고유 값 다중 열

원하는 출력 pandas 용액

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

답변

77

pd.unique는 입력 배열 또는 DataFrame 컬럼 인덱스에서 고유 값을 반환한다.

이 함수에 대한 입력은 1 차원이어야하므로 여러 열을 결합해야합니다. 가장 간단한 방법은 원하는 열을 선택한 다음 평평한 NumPy 배열에서 값을 보는 것입니다. 전체 동작은 다음과 같다 : ravel()가 리턴하는 배열 방법 다차원 어레이의 뷰 (가능한 경우)이다

>>> pd.unique(df[['Col1', 'Col2']].values.ravel('K')) 
array(['Bob', 'Joe', 'Bill', 'Mary', 'Steve'], dtype=object) 

참고있다. 인수 'K'은 요소가 메모리에 저장된 순서대로 배열을 평행하게 만드는 방법을 알려줍니다 (팬더는 일반적으로 기본 배열을 Fortran-contiguous order에 저장하고 행 앞에있는 열). 이는 메서드의 기본 'C'순서를 사용하는 것보다 훨씬 클 수 있습니다. 이 방법은 다차원 배열을 처리 여기 ravel()을 사용할 필요가

>>> np.unique(df[['Col1', 'Col2']].values) 
array(['Bill', 'Bob', 'Joe', 'Mary', 'Steve'], dtype=object) 

없습니다 :


다른 방법은 열을 선택하고 np.unique에게 전달하는 것입니다. 그렇더라도 고유 값을 식별하기 위해 해시 테이블이 아닌 정렬 기반 알고리즘을 사용하기 때문에 pd.unique보다 느릴 수 있습니다.

속도 차이는 (고유 값의 소수에 불과하다 특히) 큰 DataFrames 상당한이다

>>> 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 
+0

을'.값 '을 입력해야합니다. 그렇지 않으면'array ([ 'Col1', 'Col2'], dtype = '| S4')' – congusbongus

+0

@congusbongus : 그 점을 지적 해 주셔서 감사합니다. '.values'는 Pandas/NumPy의 일부 버전에 필요합니다 (NumPy 1.9.2와 Pandas 15.2를 사용하여 테스트했는데, 제대로 작동하지 않았습니다). –

+1

배열 대신 데이터 프레임을 어떻게 되 찾을 수 있습니까? – Lisle

1

비이다.

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) 

출력 :

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']) 
4

나는 설정을 가지고 그것의 열에서 몇 가지 간단한 문자열을 가진 DataFrame :

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

당신은 당신이 관심있는 열을 연결하고 unique 함수를 호출 할 수 있습니다 :

>>> pandas.concat([df['a'], df['b']]).unique() 
array(['a', 'b', 'd', 'e', 'g', 'h'], dtype=object) 
3
In [5]: set(df.Col1).union(set(df.Col2)) 
Out[5]: {'Bill', 'Bob', 'Joe', 'Mary', 'Steve'} 

또는 :

set(df.Col1) | set(df.Col2)