我使用bisect
来查找第一个大于我的值的索引:
bisect.bisect_left(X['x'].iloc[116:231], x=0.15)
X是按升序排列的,第一个值X['x'].iloc[116]
是0.275。上面的二等分函数给了我KeyError: 57
。我知道它找不到相应的键,但不明白为什么它试图找到键'57'。我的期望是第一个大于0.15的值是0.275,它应该给我索引116。
我使用bisect
是因为我的列表已经排序了,但是如果有更有效的方法来找到大于特定值的第一个索引,我会很高兴,如果你让我知道。
编辑:
我尝试过其他索引和x
值,结果越来越奇怪。最小的数字是0.125:
bisect.bisect_left(X[0:10]['x'], x=0.125) # works and gives index 0
bisect.bisect_left(X[1:10]['x'], x=0.125) # KeyError: 0
bisect.bisect_left(X[2:10]['x'], x=0.125) # KeyError: 1
bisect.bisect_left(X[3:10]['x'], x=0.125) # KeyError: 1
bisect.bisect_left(X[4:10]['x'], x=0.125) # KeyError: 3
bisect.bisect_left(X[5:10]['x'], x=0.125) # KeyError: 2
bisect.bisect_left(X[6:10]['x'], x=0.125) # KeyError: 2
bisect.bisect_left(X[7:10]['x'], x=0.125) # KeyError: 1
我试图调试,但无法设法跟踪代码给出这个错误。
1条答案
按热度按时间j8ag8udp1#
bisect
库设计用于arrays
,而不是pandas.Series
。这种情况下的问题是由于
bisect_left(a, x, lo=0, hi=len(a))
可能会尝试访问a[lo]
和a[hi]
之间的所有元素。由于pandas.Series
覆盖了[]
括号运算符的使用,因此当bisect_left
函数在内部调用a[0]
时,它不会调用传递的数组的第一个元素,而是尝试访问具有index的序列的元素0
,它不存在于X['x'].iloc[116:231]
。为了解决这个问题,您必须将
pandas.Series
转换为例如list
并添加索引位移或明确指定
lo
和hi
的限制。