有人能指出我的链接或解释大熊猫索引的好处吗?我经常处理表并根据列加入它们,这个加入/合并过程似乎无论如何重新编制索引,所以考虑到我认为我不需要,应用索引标准有点麻烦。
关于索引的最佳实践的任何想法?
答案 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_index
,stack
,unstack
,pivot
,pivot_table
,melt
,
lreshape
和crosstab
都使用或操纵索引。
有时,我们希望DataFrame具有不同的形状以用于演示目的,或者用于join
,merge
或groupby
操作。 (正如您所说,加入也可以基于列值完成,但基于索引的加入更快。)在幕后,join
,merge
和groupby
利用快速索引尽可能查找。
时间序列包含resample
,asfreq
和interpolate
方法,其底层实现也利用快速索引查找。
所以最后,我认为索引的有用性的起源,为什么它出现在如此多的函数中,是由于它能够执行快速哈希 查找。