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

