如何将DataFrame中差值为1的Series值统一为相同数值?
解决方案
思路
核心是将相邻差值绝对值≤1的连续数值划分为同一组,然后将组内所有值统一替换为该组的最大值(根据示例需求,选择统一为较大值;若要统一为较小值,可替换为min)。
代码实现
import pandas as pd # 原始数据 df = pd.DataFrame() df['yMax'] = [127, 300, 300, 322, 322, 322, 322, 344, 344, 344, 366, 366, 367, 367, 367, 388, 388, 388, 388, 389, 389, 402, 403, 403, 403] # 1. 生成分组ID:当相邻差值绝对值>1时,开启新分组 group_ids = (abs(df['yMax'].diff()) > 1).cumsum() # 2. 对每个分组取最大值,替换原列 df['yMax'] = df.groupby(group_ids)['yMax'].transform('max') # 查看结果 print(df['yMax'].tolist())
输出结果
[127, 300, 300, 322, 322, 322, 322, 344, 344, 344, 367, 367, 367, 367, 367, 389, 389, 389, 389, 389, 389, 403, 403, 403, 403]
代码解释
abs(df['yMax'].diff()) > 1:判断相邻元素差值的绝对值是否大于1,生成布尔序列,True表示需要开启新分组。.cumsum():对布尔序列累加,将连续的True/False转化为递增的分组ID,确保差值≤1的连续元素被分到同一组。groupby(group_ids)['yMax'].transform('max'):按分组ID聚合,对每个分组取最大值,并将结果映射回原DataFrame的每一行,实现组内值的统一替换。
内容的提问来源于stack exchange,提问作者Sati
相关产品推荐
相关产品推荐

