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

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方法实现高效的向量化匹配,步骤如下:

  1. 确保参考列表是升序排序的(本题给定的列表已满足,若不确定可先执行num_list.sort())
  2. 用searchsorted获取每个Series元素在列表中的插入位置,通过索引偏移得到目标元素的位置
  3. 批量提取对应值并生成新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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:31:49