python - 在列表中查找数字递增(具有不同增量)的组

标签 python pandas numpy

我有一个列表,其中包含具有不同增量的不断增加的数字“组”。这是一个例子:

l = [0, 1, 5, 8, 10, 20, 30, 40, 45, 48, 77, 100, 200, 300, 400]

我想回来:

[[0], [1], [5], [8], [10, 20, 30, 40], [45], [48], [77], [100, 200, 300, 400]]

解释:0、1、5、8 不遵循固定增量(+1、+4、+3),而 [10、20、30、40] 都有固定的 +10 增量。


我知道如何使用 for 循环和 curr_groupcurr_delta 等变量来完成此操作,但我想避免这种情况。

使用 pandas,我能够得到这个:

import pandas as pd

df = pd.DataFrame({'col': [0, 1, 5, 8, 10, 20, 30, 40, 45, 48, 77, 100, 200, 300, 400]})
df['shift_diff'] = (df.diff() != df.diff().shift(-1)).astype('int')
df['group'] = df.shift_diff.cumsum()
print list(df.groupby('group').col.apply(list))

输出

[[0], [1], [5], [8], [10, 20, 30], [40], [45], [48], [77], [100, 200, 300], [400]]

非常接近,但所有长度 > 1 的组([10, 20, 30][100, 200, 300])都缺少最后一个元素.

如果有一个简短而优雅的解决方案,我们将不胜感激!谢谢

最佳答案

这是你想要的吗?

df['group'] = (~((df-df.shift()).diff().eq(0)|(df-df.shift(-1)).diff().eq(0))).cumsum()
print(list(df.groupby('group').col.apply(list)))
[[0], [1], [5], [8], [10, 20, 30, 40], [45], [48], [77], [100, 200, 300, 400]]

关于python - 在列表中查找数字递增(具有不同增量)的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47087099/

相关文章:

python - Django 的管理命令如何管理事务?

python - 使用python从指数分布和模型生成随机数

python - 合并两个数据框,但仅显示一条记录上的合并数据

python - 带有 numpy 矩阵的 Numba 未运行——未知属性

python - 格式化数据集的问题

java - python解释器导入错误

python - 为什么我的计算机中的 Python 列表不能容纳超过 693 个数字?

python - Pandas - 将多个值解压到另一列并合并到其中的一个 Df

python - Tensorflow 查找具有匹配值的像素

Python:返回元组或列表?