Python Pandas:如何对差值≤1的元素进行分组
解决按分组后将差值≤1的元素归为子组的问题
这问题我之前处理类似需求时也碰到过,用pandas的分组结合diff和累积求和就能完美解决,咱们一步步来实现:
1. 先构造示例数据
首先把你给出的示例DataFrame用代码还原出来:
import pandas as pd data = { 'group_number': [1,1,1,1,1,1,1,2,2,2,2,2,2,2], 'val': [5,8,12,13,22,26,31,7,16,17,19,29,33,62] } df = pd.DataFrame(data)
2. 核心逻辑实现
我们需要定义一个处理每个分组的函数,然后应用到group_number的分组上:
def assign_subgroups(group): # 先对组内的val排序,确保差值计算的顺序正确(如果你的原始数据已经有序,这步可以省略) sorted_group = group.sort_values('val').reset_index(drop=True) # 计算相邻val的差值,第一行没有前一个元素,我们默认它属于新组(差值设为2,大于1) diff_over_threshold = sorted_group['val'].diff().fillna(2) > 1 # 对布尔值累积求和,得到唯一的子组ID sorted_group['subgroup'] = diff_over_threshold.cumsum() return sorted_group # 应用到每个group_number分组,得到最终结果 result_df = df.groupby('group_number', group_keys=False).apply(assign_subgroups)
3. 结果说明
运行后你会看到result_df里新增了subgroup列,同一group_number下,subgroup相同的就是满足条件的子组:
- group_number=1中,val=12和13的
subgroup都是3,被归为同一子组 - group_number=2中,val=16和17的
subgroup都是2,被归为同一子组
逻辑拆解
diff():计算当前行val与前一行val的差值,第一行返回NaNfillna(2):把第一行的NaN替换成2,这样判断>1时会返回True,作为第一个子组的起始cumsum():对布尔序列累积求和,每遇到一个True(即差值超过1),子组ID就加1,这样连续差值≤1的元素会共享同一个子组ID
内容的提问来源于stack exchange,提问作者Binyamin Even
相关产品推荐
相关产品推荐

