You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

技术需求:筛选保留ID分组下含4个连续数值的数据行

按ID分组筛选连续数值序列(长度≥4)的行

需求说明

针对每个ID分组,仅保留其X列中属于连续4个及以上数值序列的行,排除不符合条件的行。例如ID=1的X列包含100、101、102、103、105,其中105不属于连续4个数值的序列,需剔除。


原始数据

ID    X
0    1  100
1    1  101
2    1  102
3    1  103
4    1  105
5    2  100
6    2  102
7    2  103
8    2  104
9    3  100
10   3  101
11   3  102
12   3  103
13   3  106
14   3  107
15   3  108
16   3  109
17   3  110
18   3  112
19   4  100
20   4  102
21   4  103
22   4  104
23   4  105
24   4  107

预期结果

ID    X
0    1  100
1    1  101
2    1  102
3    1  103
4    3  100
5    3  101
6    3  102
7    3  103
8    3  106
9    3  107
10   3  108
11   3  109
12   3  110
13   4  102
14   4  103
15   4  104
16   4  105

实现方案(Python Pandas)

核心逻辑是按ID分组后识别连续数值区块,保留长度≥4的区块内容:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'ID': [1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4],
    'X': [100,101,102,103,105,100,102,103,104,100,101,102,103,106,107,108,109,110,112,100,102,103,104,105,107]
})

# 为每个ID分组内的连续数值序列标记分组ID
df['seq_group'] = df.groupby('ID')['X'].diff().ne(1).cumsum()

# 统计每个连续序列的长度
seq_lengths = df.groupby(['ID', 'seq_group']).size().reset_index(name='length')

# 筛选出长度≥4的有效序列
valid_seqs = seq_lengths[seq_lengths['length'] >= 4][['ID', 'seq_group']]

# 保留有效序列对应的行
result = df.merge(valid_seqs, on=['ID', 'seq_group']).drop(columns='seq_group')

# 重置索引以匹配预期结果格式
result = result.reset_index(drop=True)

print(result)

关键步骤解释

  1. 标记连续序列:通过groupby('ID')['X'].diff().ne(1).cumsum(),对每个ID分组内的X值,判断当前值与前一个值是否连续(差为1),不连续则开启新的序列分组,最终得到每行所属的连续序列ID。
  2. 筛选有效序列:统计每个连续序列的长度,保留长度≥4的序列标记。
  3. 提取目标行:将原数据与有效序列标记合并,仅保留属于有效序列的行,最后重置索引对齐格式。

内容的提问来源于stack exchange,提问作者qwerty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 14:54:08