2014-12-01 39 views
20

有人可以指點我的鏈接或提供熊貓索引的好處的解釋嗎?我經常處理表格,並根據列加入它們,而這種加入/合併過程似乎無論如何都會重新編制索引,因此,考慮到我認爲我不需要,應用索引標準有點麻煩。熊貓的索引編制有什麼意義?

關於索引最佳實踐的任何想法?

+0

文檔:http://pandas.pydata.org/pandas-docs/stable/indexing。HTML,關於你的問題這是一個有點廣泛和意見的基礎,它聽起來像你沒有必要過濾你的數據,只是想整理和/或對整個數據集進行一些分析,這很好,但如果你想只能查看/計算特定行的某些內容,那麼您需要能夠索引和過濾數據 – EdChum 2014-12-01 22:01:21

回答

30

與字典一樣,DataFrame的索引由哈希表支持。根據索引值查找行 就像查找基於密鑰的字典值。

相反,列中的值與列表中的值相似。

根據索引值查找行比根據列值查找行更快。

例如,考慮

df = pd.DataFrame({'foo':np.random.random(), 'index':range(10000)}) 
df_with_index = df.set_index(['index']) 

這裏是你如何可以查找在df['index']列等於999 大熊貓必須通過在列查找那些等於999的每一個值循環任何行。

df[df['index'] == 999] 

#   foo index 
# 999 0.375489 999 

這裏是你如何能查找其中指數等於999隨着指數的任何行,熊貓使用散列值找到行:

df_with_index.loc[999] 
# foo  0.375489 
# index 999.000000 
# Name: 999, dtype: float64 

仰望通過索引行是比列的值查找行更快:

In [254]: %timeit df[df['index'] == 999] 
1000 loops, best of 3: 368 µs per loop 

In [255]: %timeit df_with_index.loc[999] 
10000 loops, best of 3: 57.7 µs per loop 

不過請注意,它需要時間來建立索引:所以具有指數

In [220]: %timeit df.set_index(['index']) 
1000 loops, best of 3: 330 µs per loop 

只有當你有很多 這種類型的查詢才能執行。

有時,索引在重新整形DataFrame中發揮作用。許多功能,如​​,stackunstackpivotpivot_tablemeltlreshapecrosstab,全部使用或操縱的指數。 有時我們需要將DataFrame用於不同的形狀以用於演示目的,或者需要joinmergegroupby操作。 (正如您注意的加入也可以基於列值完成,但基於索引的加入速度更快。)在幕後,joinmergegroupby儘可能利用快速索引查找。

時間序列有resample,asfreqinterpolate其底層實現也利用快速索引查找的方法。因此,最後,我認爲索引的有用性的起源,爲什麼它出現在如此多的函數中,是由於它能夠執行快速哈希 查找。

+0

因此,如果使用索引列,那麼不僅查找,而且合併操作會更快,對嗎? – user3659451 2014-12-01 23:14:55

+0

並感謝您的這個偉大的解釋! – user3659451 2014-12-01 23:15:16

+0

是的,加入調用合併(在大多數情況下)。由於快速查找,按索引合併比按列合併更快。所以最終都會回到快速查找能力。 – unutbu 2014-12-02 00:40:41