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

如何在Dataframe中获取A列值变更首行及前组B列最邻近新值行

解决方案

步骤1:构造示例数据

先把你提供的示例数据转换成Dataframe:

import pandas as pd

data = {
    'A': [803, 803, 803, 803, 803, 803, 805, 805, 805, 805, 805, 805, 804, 804, 804, 803],
    'B': [803.4, 803.5, 803.6, 803.9, 803.7, 803.8, 804.4, 804.5, 804.6, 804.9, 804.3, 804.2, 804.2, 804.1, 803.9, 803.4]
}
df = pd.DataFrame(data)

步骤2:标记A列的分组及组的首行

给连续相同的A值生成分组标识,同时标记每组的首行:

# 生成分组号:A列与前一行不同时,分组号递增
df['group_id'] = (df['A'] != df['A'].shift(1)).cumsum()
# 标记每组的首行
df['is_first_row'] = df['group_id'] != df['group_id'].shift(1)

步骤3:映射每组对应的下一组A值

先提取每个分组的A值,再关联下一组的A值到原数据:

# 获取每个分组的A值
group_a_values = df.groupby('group_id')['A'].first().reset_index()
# 添加下一组的A值,最后一组无下一组设为NaN
group_a_values['next_group_A'] = group_a_values['A'].shift(-1)
# 把下一组A值映射回原Dataframe
df = df.merge(group_a_values[['group_id', 'next_group_A']], on='group_id', how='left')

步骤4:提取每组中B与下一组A最邻近的行

计算B与下一组A的绝对差值,找到每个分组中差值最小的行:

# 计算B与下一组A的绝对差
df['abs_diff'] = abs(df['B'] - df['next_group_A'])
# 筛选出有下一组的分组,提取差值最小的行
nearest_rows = df[df['next_group_A'].notna()].groupby('group_id').apply(
    lambda x: x.loc[x['abs_diff'].idxmin()]
).reset_index(drop=True)

步骤5:合并两类行并整理结果

把首行和邻近行合并,去重后按原顺序排序:

# 提取所有首行
first_rows = df[df['is_first_row']]
# 合并两类行并去重、排序
result = pd.concat([first_rows, nearest_rows]).drop_duplicates().sort_index()
# 保留目标列,移除辅助列
result = result[['A', 'B']]

最终输出结果

A      B
0   803  803.4
3   803  803.9
6   805  804.4
11  805  804.2
12  804  804.2
14  804  803.9
15  803  803.4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:48:17