大熊猫索引有啥意义?

Posted

技术标签:

【中文标题】大熊猫索引有啥意义?【英文标题】:What is the point of indexing in pandas?大熊猫索引有什么意义? 【发布时间】:2015-01-30 00:42:24 【问题描述】:

谁能给我一个链接或解释在熊猫中建立索引的好处?我经常处理表格并根据列连接它们,而且这个连接/合并过程似乎无论如何都会重新索引事物,所以考虑到我认为我不需要应用索引标准有点麻烦。

关于索引的最佳实践有什么想法吗?

【问题讨论】:

Docs:pandas.pydata.org/pandas-docs/stable/indexing.html,关于您的问题有点宽泛且基于意见,听起来您不需要过滤数据,只是想整理和/或执行一些分析在整个数据集上,这很好,但如果您只想查看/计算特定行的内容,那么您需要能够索引和过滤您的数据 【参考方案1】:

像字典一样,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 方法,它们的底层实现也利用了快速索引查找。

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

【讨论】:

所以不只是查找,如果使用索引列,合并操作也会更快,对吧? 是的,加入呼叫合并(在大多数情况下)。由于快速查找,按索引合并比按列合并更快。所以最终这一切都回到了快速查找能力。 所以如果我索引我的表,然后基于my_column 做一个group by,它还会更快吗?听起来group by 基于索引会更快。但是基于另一列值呢? @puifais:一般来说,您必须以两种方式测试您的代码才能确定哪种方式更快。 @unutbu Dataframes 索引真的基于哈希表吗?随着数据帧大小的增加,性能似乎会下降,而字典性能不会。如果我这样做: df = pd.DataFrame(data='a':range(int(10e5))) %timeit df.loc[4000] 然后将 df 的大小增加到 10e7 然后时间增加大约 40%

以上是关于大熊猫索引有啥意义?的主要内容,如果未能解决你的问题,请参考以下文章

python3 - 熊猫确定事件发生是不是具有统计意义

拥有复杂的实体类有啥意义(在 Hibernate 意义上)

mapDispatchToProps:有啥意义吗?

朋友和内联方法,有啥意义?

CAGradientLayer 类型——有啥意义?

包修饰符有啥意义?