【发布时间】:2018-04-19 08:45:32
【问题描述】:
我正在处理两个数据帧 df1 和 df2。
我使用了代码:
df1.index.searchsorted(df2.index)
但我不确定它是如何工作的。 有人可以解释一下吗?
【问题讨论】:
标签: python pandas dataframe indexing
我正在处理两个数据帧 df1 和 df2。
我使用了代码:
df1.index.searchsorted(df2.index)
但我不确定它是如何工作的。 有人可以解释一下吗?
【问题讨论】:
标签: python pandas dataframe indexing
该方法将binary search 应用于索引。这是一种众所周知的算法,它利用值已经按排序顺序在尽可能少的步骤中找到插入索引这一事实。
二分搜索的工作原理是选择值的中间元素,然后将其与搜索到的值进行比较;如果该值低于该中间元素,则将搜索范围缩小到前半部分,如果后半部分较大,则查看后半部分。
通过这种方式,您可以将查找元素所需的步骤数最多减少到索引长度的对数。对于 1000 个元素,少于 7 个步骤,对于一百万个元素,少于 14 个,等等。
插入索引是添加值以保持索引排序的地方; left 位置也恰好是 匹配 值的索引,因此您也可以使用它来查找插入缺失或重复值的位置,并测试给定值是否存在于索引。
pandas 实现基本上是numpy.sortedsearch() 函数,它使用generated C code 来优化对不同对象类型的搜索,挤出每一滴速度。
Pandas 在各种索引实现中使用该方法以确保快速操作。例如,您通常不会使用此方法来测试索引中是否存在值,因为 Pandas 索引已经为您实现了一个有效的__contains__ 方法,通常基于searchsorted(),这是有意义的。有关此类示例,请参见 DateTimeEngine.__contains__()。
【讨论】:
index.get_loc 是否足够聪明,可以在对index 进行排序时使用 searchsorted 或其他一些日志时间方法?
index.get_loc 将在适当的情况下使用searchsorted。例如,DateTimeEngine.get_loc implementation 就是这样做的。