2013-05-18 12 views
20

パンダのドキュメントから、私はその一意のインデックスを収集して、特定の操作を効率的にし、一意でないインデックスが許容されることがあることを時折認めます。パンダのユニークでないインデックスのパフォーマンスへの影響は?

外部からは、一意でないインデックスが何らかの形で利用されるようには見えません。たとえば、次のようix問合せは、それが全体のデータフレームにスキャンしているように見えるということは十分に遅い

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 

(私は2つのixクエリが同じものを返さない実現 - それはixに呼び出すだけ例です

ユニークでないインデックスやソートされたインデックスのバイナリ検索などの高速検索方法を使用する方法はありますか?

答えて

43

インデックスが一意の場合、pandasはハッシュテーブルを使用してキーを値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

関連する問題