大熊猫索引的重点是什么?

时间:2014-12-01 21:55:00

标签: python pandas indexing

有人能指出我的链接或解释大熊猫索引的好处吗?我经常处理表并根据列加入它们,这个加入/合并过程似乎无论如何重新编制索引,所以考虑到我认为我不需要,应用索引标准有点麻烦。

关于索引的最佳实践的任何想法?

1 个答案:

答案 0 :(得分:61)

与dict类似,DataFrame的索引由哈希表支持。查找行 基于索引值就像根据键查找dict值一样。

相反,列中的值与列表中的值类似。

根据索引值查找行比基于列值查找行更快。

例如,考虑

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

以下是查看df['index']列等于999的任何行的方法。 Pandas必须遍历列中的每个值才能找到等于999的值。

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

#           foo  index
# 999  0.375489    999

以下是如何查找索引等于999的任何行。使用索引,Pandas使用哈希值来查找行:

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中发挥作用。许多功能,例如set_indexstackunstackpivotpivot_tablemeltlreshapecrosstab都使用或操纵索引。 有时,我们希望DataFrame具有不同的形状以用于演示目的,或者用于joinmergegroupby操作。 (正如您所说,加入也可以基于列值完成,但基于索引的加入更快。)在幕后,joinmergegroupby利用快速索引尽可能查找。

时间序列包含resampleasfreqinterpolate方法,其底层实现也利用快速索引查找。

所以最后,我认为索引的有用性的起源,为什么它出现在如此多的函数中,是由于它能够执行快速哈希 查找。