Python:查找列表中不超过Series元素的最近值并替换
实现方案:为Pandas Series元素匹配列表中不超过其值的最近项
问题说明
给定以下Pandas Series和数值列表,需要将Series中的每个元素替换为列表中不超过该元素的最大值(即最近的不大于目标值的数),要求避免使用for循环:
原始数据
- 待处理的Series:
import pandas as pd s = pd.Series([25, 33, 39])
输出:
0 25 1 33 2 39 dtype: int64
- 参考数值列表:
num_list = [5, 10, 20, 26, 30, 31, 32, 35, 40]
列表内容:[5, 10, 20, 26, 30, 31, 32, 35, 40]
期望输出
0 20 1 31 2 35 dtype: int64
解决方案(向量化实现,无循环)
利用numpy的searchsorted方法实现高效的向量化匹配,步骤如下:
- 确保参考列表是升序排序的(本题给定的列表已满足,若不确定可先执行
num_list.sort()) - 用
searchsorted获取每个Series元素在列表中的插入位置,通过索引偏移得到目标元素的位置 - 批量提取对应值并生成新Series
完整代码
import pandas as pd import numpy as np s = pd.Series([25, 33, 39]) num_list = [5, 10, 20, 26, 30, 31, 32, 35, 40] # 若列表未排序,先执行排序 # num_list.sort() # 获取每个元素对应的目标索引 indices = np.searchsorted(num_list, s, side='right') - 1 # 生成结果Series,保留原索引 result = pd.Series(np.array(num_list)[indices], index=s.index) print(result)
代码解释
np.searchsorted(num_list, s, side='right'):对每个Series元素,返回其在升序列表中插入后仍保持有序的右侧位置,减1后得到不超过该元素的最大数值的索引np.array(num_list)[indices]:批量提取列表中对应索引的数值,避免循环遍历- 最终生成的Series保留原Series的索引,符合需求格式
内容的提问来源于stack exchange,提问作者ghost_like
相关产品推荐
相关产品推荐

