2013-05-18 2 views
20

팬더 문서에서 고유 값 인덱스를 사용하여 특정 작업을 효율적으로 수행하고 비 고유 인덱스를 허용하는 경우가 있습니다.판다에서 고유하지 않은 색인의 성능 영향은 무엇입니까?

외부에서 보면 고유하지 않은 색인이 어떤 식 으로든 활용되는 것처럼 보이지 않습니다. 예를 들어, 다음 ix 쿼리는 전체 dataframe를 스캔 할 것으로 보인다 충분히 느린

In [23]: import numpy as np 
In [24]: import pandas as pd 
In [25]: x = np.random.randint(0, 10**7, 10**7) 
In [26]: df1 = pd.DataFrame({'x':x}) 
In [27]: df2 = df1.set_index('x', drop=False) 
In [28]: %timeit df2.ix[0] 
1 loops, best of 3: 402 ms per loop 
In [29]: %timeit df1.ix[0] 
10000 loops, best of 3: 123 us per loop 

(I 두 ix 쿼리가 같은 일을 반환하지 않습니다 실현 - 그것은 ix 호출 단지 예입니다 고유하지 않은 색인에서 더 느리게 나타남)

고유하지 않은 색인이나 정렬 된 색인에서 이진 검색과 같은 더 빠른 조회 방법을 사용하여 팬더를 감추는 방법이 있습니까?

답변

43

색인이 고유하면 팬더는 해시 테이블을 사용하여 키를 값 O (1)에 매핑합니다. 인덱스가 고유하지 않고 정렬 된 경우 팬더는 이진 검색 O (logN)을 사용합니다. 인덱스가 임의 순서 인 경우 팬더는 인덱스 O (N)의 모든 키를 확인해야합니다.

당신은 sort_index 메소드를 호출 할 수 있습니다

import numpy as np 
import pandas as pd 
x = np.random.randint(0, 200, 10**6) 
df1 = pd.DataFrame({'x':x}) 
df2 = df1.set_index('x', drop=False) 
df3 = df2.sort_index() 
%timeit df1.loc[100] 
%timeit df2.loc[100] 
%timeit df3.loc[100] 

결과 :

10000 loops, best of 3: 71.2 µs per loop 
10 loops, best of 3: 38.9 ms per loop 
10000 loops, best of 3: 134 µs per loop 
+0

적극 추천 대답! 고맙습니다. – Neerav

관련 문제