如何用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
相关产品推荐
相关产品推荐

