Pandas中DataFrame每次出现新值时如何删除对应分组前5行
Pandas 按连续值分组删除每组前N行实现
实现逻辑
需求核心是识别指定列的连续同值块(而非全局同值分组),每个块单独跳过前5行保留剩余数据,实现分三步:
- 给每个连续同值块分配唯一ID:判断当前行和上一行指定列值是否不等,不等则分组ID累加
- 对每个块内的行按顺序编号,编号从0开始
- 筛选块内编号≥5的行,即为删除前5行后的结果,清理过程中生成的临时列即可
完整代码
import pandas as pd # 测试数据 data = { 'col1': ['A', 'A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'C', 'C', 'C'], 'col2': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21] } df = pd.DataFrame(data) # 标记连续同值块ID df['block_id'] = df['col1'].ne(df['col1'].shift()).cumsum() # 块内行顺序编号 df['row_idx'] = df.groupby('block_id').cumcount() # 过滤前5行,删除临时列 res = df[df['row_idx'] >= 5].drop(columns=['block_id', 'row_idx']).reset_index(drop=True) print(res)
运行结果
col1 col2 0 A 6 1 A 7 2 B 13 3 B 14 4 C 20 5 C 21
注意事项
- 该逻辑严格按「连续出现的同值」分组,若同一值后续断开后再次出现,会被识别为新的独立块,单独执行删前5行的逻辑,完全匹配「每次出现新取值」的需求
- 若某连续块总行数不足5行,该块所有数据会被过滤;如果需要调整删除行数,直接修改筛选条件里的数字阈值即可
内容的提问来源于stack exchange,提问作者ma59299
相关产品推荐
相关产品推荐

