Pandas如何每隔5行删除冗余行 仅保留每组首条机器ID记录
问题原因
你之前使用的y_data.groupby(np.arange(len(y_data)) // 5)写法存在两个明显问题:
- 硬编码了每5行作为一个分组,仅能适配你给出的样例中「每个机器ID刚好连续出现5次」的特殊情况,实际数据中只要某个ID连续出现的行数不是5,分组逻辑就会完全错乱
- 代码仅生成了GroupBy分组对象,没有执行「取每组第一行」的聚合操作,自然无法得到预期结果
实现方案
核心逻辑是识别连续相同机器ID组成的块,每个块仅保留第一行即可,不需要依赖固定的块长度,适配任意连续重复次数的场景。
方案1:Pandas 环境实现(适配你已有的DataFrame数据结构)
利用相邻行ID是否变化生成连续块的分组编号,再分组取每组首行即可:
# 请把代码里的machine_id替换成你数据中存储机器ID的实际列名 y_data = y_data.groupby( (y_data['machine_id'] != y_data['machine_id'].shift()).cumsum(), as_index=False ).first() # 如需重置结果的索引为从0开始的连续序号,追加下行代码 y_data = y_data.reset_index(drop=True)
这段代码的分组键生成逻辑:当前行ID和上一行ID不一致时,块编号加1,一致则保持当前块编号,能自动给所有连续相同ID的块分配唯一标识。
方案2:纯Python原生实现(无第三方依赖,直接处理原始文本/CSV)
逐行遍历数据,仅保留和上一条记录ID不同的行,逻辑更轻量:
result = [] last_machine_id = None # 替换成你的实际数据读取逻辑,这里以读取CSV文件为例 with open("your_source_data.csv", "r", encoding="utf-8") as f: for line in f: line = line.strip() if not line: continue _, current_mid = line.split(",") if current_mid != last_machine_id: # 按你预期的格式生成新行,索引从0开始递增 result.append(f"{len(result)},{current_mid}") last_machine_id = current_mid # 结果可以直接打印或者写入新文件 for row in result: print(row)
两种方案跑你提供的样例数据,都能得到你给出的预期输出,包括索引15位置再次出现的
M_0003也会被正常保留,不会被全局去重误删。
内容的提问来源于stack exchange,提问作者Patrycja
相关产品推荐
相关产品推荐

