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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:09:27