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

Pandas中按ID列分组后如何删除每个分组的最后2行?

Pandas按ID分组删除每组最后2行的实现方案

可直接运行的实现方法

  • 方法1:直接定位待删除行,代码最简短
    利用groupby.tail(2)可直接取出每个分组的最后2行数据,拿到这些行的索引后从原数据集删除,完全匹配“反向删除、保留剩余行”的需求:
    # 收集每个ID分组最后2行的索引
    drop_index = df.groupby('ID').tail(2).index
    # 删除对应行得到最终结果
    df_res = df.drop(drop_index)
    
    边界逻辑:如果某个ID分组本身总行数≤2,删除后该分组不会留存任何行,完全符合“删除最后2行”的预期,不存在逻辑bug。
  • 方法2:通过组内序号条件筛选,灵活性更高
    借助分组内的行累计序号、分组总长度做条件判断,过滤掉每组末尾的2行,适合需要叠加其他自定义筛选条件的场景:
    # 计算每个元素在所属组内的0起始序号
    group_seq = df.groupby('ID').cumcount()
    # 计算每个元素所属组的总行数
    group_length = df.groupby('ID')['ID'].transform('count')
    # 仅保留组内序号小于(组长度-2)的行,即剔除每组最后2行
    df_res = df[group_seq < group_length - 2]
    

常见认知纠正

你之前提到的df.groupby('ID').nth(-2)实际是抽取每个ID分组的倒数第2行单一样本,根本达不到“保留每组最后2行”的效果。如果真要保留每组最后2行,应该用df.groupby('ID').tail(2),别把nth的参数用法和tail搞混,容易出现筛选结果错漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 00:36:08