技术需求:筛选保留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)
关键步骤解释
- 标记连续序列:通过
groupby('ID')['X'].diff().ne(1).cumsum(),对每个ID分组内的X值,判断当前值与前一个值是否连续(差为1),不连续则开启新的序列分组,最终得到每行所属的连续序列ID。 - 筛选有效序列:统计每个连续序列的长度,保留长度≥4的序列标记。
- 提取目标行:将原数据与有效序列标记合并,仅保留属于有效序列的行,最后重置索引对齐格式。
内容的提问来源于stack exchange,提问作者qwerty
相关产品推荐
相关产品推荐

