Python bisect和Pandas dataframe:密钥错误

vlju58qv  于 2023-03-21  发布在  Python
关注(0)|答案(1)|浏览(171)

我使用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

我试图调试,但无法设法跟踪代码给出这个错误。

j8ag8udp

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并添加索引位移

bisect.bisect_left(list(X['x'].iloc[116:231]), x=0.15)+116

或明确指定lohi的限制。

bisect.bisect_left(X['x'].iloc[116:231], x=0.15, lo=116, hi=231)

相关问题