2013-05-18 237 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 

(我知道這兩個ix查詢不會返回同樣的事情 - 它只是調用ix爲例在非唯一索引上出現的速度要慢得多)

有什麼辦法可以讓大熊貓變成像使用非唯一索引和/或排序索引上的二進制搜索一樣的快速查找方法嗎?

回答

43

當索引是唯一的時,pandas使用散列表將鍵映射到值O(1)。當索引是非唯一的並且排序時,pandas使用二進制搜索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

相關問題