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

如何用Pandas查找DataFrame多段数据中最接近指定值的行索引

解决方法

要实现按x列的连续分段获取每段最接近20的行索引,核心是先给每个连续段打上分组标签,再按分组计算目标索引。

步骤1:构造测试数据

先模拟符合需求的DataFrame(包含多段连续递增的x列,el1/el2/el3为无关列):

import pandas as pd
import numpy as np

# 构造三段连续递增的x数据
x1 = np.linspace(6, 31, 50)
x2 = np.linspace(7, 45, 60)
x3 = np.linspace(2, 27, 40)
x = np.concatenate([x1, x2, x3])

# 生成DataFrame
df = pd.DataFrame({
    'el1': np.random.rand(len(x)),
    'el2': np.random.rand(len(x)),
    'el3': np.random.rand(len(x)),
    'x': x
})

步骤2:标记连续分段

这里假设连续段是递增序列(段与段之间x值会突然回落),通过判断当前x是否小于前一行x来标记新段,用cumsum()生成分组标签:

# 标记分段:当x小于前一行时,视为新段的开始
df['segment'] = (df['x'] < df['x'].shift(1)).cumsum()

如果你的连续段是其他规则(比如递减、或相邻差值超过阈值),只需调整括号内的判断逻辑:

# 示例:相邻x差值绝对值>5时视为新段
df['segment'] = (df['x'].diff().abs() > 5).cumsum()

步骤3:按分组获取每段最接近20的索引

用groupby结合apply,对每个分组计算x与20的绝对差的最小索引:

# 按分组计算每段最接近20的行索引
closest_indices = df.groupby('segment')['x'].apply(
    lambda s: s.sub(20).abs().idxmin()
).tolist()

print(closest_indices)

运行后会得到每个连续段中x最接近20的行索引列表,对应你示例中的19.3、19.8、19.9所在的索引。

补充说明

  • 若不需要保留segment列,可在计算后用df.drop('segment', axis=1)删除。
  • 若x列的连续段规则更复杂(比如非单调的连续区间),只需调整分段标记的逻辑,核心分组计算部分保持不变。

内容的提问来源于stack exchange,提问作者KansaiRobot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 04:20:32