如何用numpy/scipy/pandas高级函数基于偏移量对有序列表分箱
问题描述
现有一个无重复的有序列表:
ls = [0, 1, 2, 4, 6, 7] # 无重复且已排序
需要基于偏移量(示例中offset=1)对该列表进行分箱,预期输出如下:
[[0, 1, 2], [4], [6, 7]] # 说明: # [0,1,2]中0和2的差不是1,但1和2的差是1,这正是我想要的分组逻辑
请问numpy、scipy、pandas等Python库中是否存在可实现该需求的高级函数?返回的数据结构不限。
解决方案
当然有,几个常用库都能实现这个需求,以下是具体方法:
1. 使用numpy实现
利用numpy.diff()计算相邻元素的差值,找到差值大于偏移量的位置,再用numpy.split()拆分数组:
import numpy as np ls = [0, 1, 2, 4, 6, 7] offset = 1 arr = np.array(ls) # 找到相邻元素差大于offset的索引位置 split_indices = np.where(np.diff(arr) > offset)[0] + 1 # 拆分数组 result = np.split(arr, split_indices) # 转成列表格式(可选) result = [subarr.tolist() for subarr in result] print(result) # 输出: [[0, 1, 2], [4], [6, 7]]
2. 使用pandas实现
通过计算相邻元素的差值,生成分组标识,再用groupby()分组:
import pandas as pd ls = [0, 1, 2, 4, 6, 7] offset = 1 df = pd.DataFrame({'val': ls}) # 计算相邻元素差,大于offset则标记为新分组起点 df['group'] = (df['val'].diff() > offset).cumsum() # 分组后提取每组的值 result = [group['val'].tolist() for _, group in df.groupby('group')] print(result) # 输出: [[0, 1, 2], [4], [6, 7]]
这两种方法都是利用了列表已排序且无重复的特性,通过判断相邻元素的差值是否超过偏移量来划分分组,完全符合需求。
内容的提问来源于stack exchange,提问作者jamesB
相关产品推荐
相关产品推荐

