如何根据相邻元素之间的差异将列表分为列表列表?

时间:2019-03-28 13:39:16

标签: python pandas numpy pandas-groupby

例如,如果我有

MAX_ALLOWED_DIFF = 3
nums=[1, 2, 4, 10, 13, 2, 5, 5, 5]

输出应为

groups = [[1, 2, 4], [10, 13], [2, 5, 5, 5]]

上下文:我有一个pandas.Series object nums,我曾经使用过

nums = nums.diff().gt(DETECTION_MAX_DIFF_NS).cumsum()).apply(list).tolist()

以相同的方式进行二次采样,但是我发现Series nums中有很多重复项,并且在我使用.unique()方法之后,我不再有Series对象了,我有numpy.ndarray(1D)。

我相信我可能会使用pandas.Series(nums.unique)之类的东西,但我不喜欢这种技巧。

3 个答案:

答案 0 :(得分:3)

这是一种方法-

>>> import numpy as np
>>> idx = np.r_[0,np.flatnonzero(np.abs(np.diff(nums))>MAX_ALLOWED_DIFF)+1,len(nums)]
>>> [nums[i:j] for (i,j) in zip(idx[:-1],idx[1:])]
[[1, 2, 4], [10, 13], [2, 5, 5, 5]]

答案 1 :(得分:3)

因此,我们使用drop_duplicates,将nums留在pd.Series

nums=nums.drop_duplicates()
nums.groupby(nums.diff().abs().gt(MAX_ALLOWED_DIFF).cumsum()).apply(list).tolist()
Out[447]: [[1, 2, 4], [10, 13], [5]]

答案 2 :(得分:2)

考虑到您也标记了numpy,这是一种实现方法:

thr = 3
ix = np.flatnonzero(np.concatenate([[False], np.abs(np.diff(nums))>thr]))
np.split(nums, ix)

输出

[array([1, 2, 4]), array([10, 13]), array([2, 5, 5, 5])]