You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何查找指定值在已排序pandas DataFrame中的插入行索引

实现方法

你的需求本质是在按x、y列升序排列的表中,做字典序的二分查找定位插入点,直接用Pandas内置的searchsorted方法即可实现,时间复杂度为O(logn),远优于逐行遍历的方案。

代码实现

import pandas as pd

# 示例数据
value = [3, 2.5]
df = pd.DataFrame({'x':[1,1,1,2,2,2,3,3,3], 'y':[1,2,3,1,2,3,1,2,3]})

# 构建和排序规则一致的多重索引
sorted_multi_idx = pd.MultiIndex.from_arrays([df['x'], df['y']])
# 二分查找插入位置,side='left'保证返回符合要求的较小索引
insert_pos = sorted_multi_idx.searchsorted(tuple(value), side='left')[0]

print(insert_pos) # 输出8,和预期结果一致

说明

  • 该方法的前提是DataFrame已经严格按照x列优先、y列次之的升序规则排序,和你给出的示例状态一致。
  • side='left'参数的作用是:如果表中已经存在和目标值完全相等的行,会返回第一个匹配行的位置,始终满足“取较小索引”的要求。
  • 如果需要获取插入位置前最后一个小于目标值的行的0基序号,直接对结果减1即可。

可选实现(基于Numpy)

如果不想使用MultiIndex,也可以转为Numpy结构化数组实现相同效果:

import numpy as np

# 构建支持多字段比较的结构化数组
dtype = [('x', df['x'].dtype), ('y', df['y'].dtype)]
sorted_arr = df[['x', 'y']].to_numpy().ravel(dtype)
target = np.array(tuple(value), dtype=dtype)

insert_pos = np.searchsorted(sorted_arr, target, side='left')
print(insert_pos) # 同样输出8

内容的提问来源于stack exchange,提问作者Yun Tae Hwang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 13:51:27