如何查找指定值在已排序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
相关产品推荐
相关产品推荐

