我想仅在向前方向上搜索熊猫数据帧列中的目标值,如果找到更大的值,那么我想将索引差异记录为结果列。我已经设法用两个内部 for 循环来做到这一点,但它非常缓慢。
这就是我想在一个简化的例子中实现的目标。
import pandas as pd
d = {
'Value' : [8,9,10,12,16,13,11,7,12,18],
'Target' : [12,12,11,15,19,11,16,11,17,18]
}
df = pd.DataFrame(data=d)
>>> df
Target Value
0 12 8
1 12 9
2 11 10
3 15 12
4 19 16
5 11 13
6 16 11
7 11 7
8 17 12
9 18 18
Run Code Online (Sandbox Code Playgroud)
我们的第一个值是 8,我们的目标值是 12。我们期待在值列中找到一个超过这个目标值的值。我们在第 4 行找到它,值为 16。我要记录的是索引差异,即 4-0=4。
下一个值是 9,目标值是 12。我们向前看值并再次找到第 4 行,值为 16。现在索引差为 4-1=3
让我们跳到第 4 行。我们开始从索引 5 开始寻找目标值。如果没有找到值,则结果为 0。
这是我想要达到的结果列。
Target Value Result
0 …Run Code Online (Sandbox Code Playgroud) 我已经阅读了大量关于 TreeSets、Comparable/Comparator Interfaces、equals、compareTo、compare 方法的文章,我知道 API 说你必须使你的排序“与等于一致”,否则可能会发生奇怪的事情。
但就我而言,我认为这是一个相当普遍的情况,我确实需要一个“与等于不一致”的 TreeSet 排序。
假设我们正在进行某种启发式搜索,并且我们正在从根(初始)状态开始扩展(或生成)新状态。我们将新的(扩展/生成的)状态放入我们通常称为打开列表的 TreeSet 中。我们想使用 TreeSet 容器,因为我们不想在我们的打开列表中出现重复的状态。
生成/扩展的每个状态都通过成本函数进行评估,并给出一个启发式值,该值显示了状态的质量。我们想要按此值排序的 TreeSet(打开列表)。我们希望在 TreeSet 的顶部拥有最佳状态(具有最佳成本值)。
现在问题来了。为了适应按成本值排序,我们需要给 TreeSet 一个比较成本值的比较器。但是,两个不同的状态可以具有相同的成本/启发式值。我希望这两个状态都在我的公开列表中,因为它们不“相等”。但是比较器需要从比较方法中返回 0,因为它们具有相同的成本值。并且因为这样,具有相同成本值的不同状态将不会被插入到列表中。
我想举一个简单的例子来使这更容易理解。假设我们的状态是显示二进制数据的字符串,成本函数计算字符串中“1”的数量。
假设这些是生成的状态及其各自的成本值。
No State Cost
1 01001001 3
2 01101001 4
3 10001001 3
4 01001111 5
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,这 4 个状态都是不同的。他们“不相等”。但是即使状态 1 和状态 3 不同,它们也具有相同的成本值“3”。因此,当我们按成本对 TreeSet 进行排序时,状态 3 将不会添加到 TreeSet 中,因为已经存在具有相同成本值的元素。但是我们需要将该状态添加到列表中,因为它是完全有效的、不同的、新的状态。
我怎样才能克服这个问题?
谢谢。