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

use*_*451 46 python indexing pandas

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

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

unu*_*tbu 66

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

相反,列中的值类似于列表中的值.

基于索引值查找行比基于列值查找行更快.

例如,考虑一下

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

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

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

#           foo  index
# 999  0.375489    999
Run Code Online (Sandbox Code Playgroud)

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

df_with_index.loc[999]
# foo        0.375489
# index    999.000000
# Name: 999, dtype: float64
Run Code Online (Sandbox Code Playgroud)

按索引查找行比按列值查找行要快得多:

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
Run Code Online (Sandbox Code Playgroud)

但请注意,构建索引需要时间:

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

因此,当您要执行此类型的许多查找时,拥有索引是有利的.

有时索引在重塑DataFrame中起作用.许多功能,如set_index,stack,unstack,pivot,pivot_table,melt, lreshape,和crosstab,全部使用或操纵的指数.有时候,我们希望在演示时使用,或不同形状的数据帧join,mergegroupby操作.(正如您所说,加入也可以基于列值完成,但基于索引的加入更快.)在幕后join,mergegroupby尽可能利用快速索引查找.

时间序列有resample,asfreq以及interpolate其底层实现也利用快速索引查找的方法.

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

  • 因此,如果使用索引列,不仅查找,而且合并操作都会更快,对吗? (3认同)
  • 是的,join 调用会合并(在大多数情况下)。由于查找速度快,按索引合并比按列合并更快。所以最终一切都回到了快速查找能力。 (2认同)
  • @unutbu Dataframes 索引真的基于哈希表吗?随着数据帧大小的增加,性能似乎会下降,而字典性能却不会。如果我这样做: df = pd.DataFrame(data={'a':range(int(10e5))}) %timeit df.loc[4000] 然后将 df 的大小增加到 10e7 然后时间增加约 40% (2认同)