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

如何在Pandas中删除按id分组后每组的第一行数据

解决按id分组后删除每组第一行的问题

首先,先把你的原始DataFrame整理成更清晰的可复现格式:

import pandas as pd

data = {
    'id': [1, 1, 1, 2, 2, 2, 2],
    'values': [3, 6, 3, 7, 6, 3, 9]
}
df = pd.DataFrame(data)

原始数据输出:

id  values
0   1       3
1   1       6
2   1       3
3   2       7
4   2       6
5   2       3
6   2       9

你期望的结果是移除每组的第一行:

id  values
1   1       6
2   1       3
4   2       6
5   2       3
6   2       9

为什么你原来的方法无效?

你使用的df.groupby('id').agg(lambda x:x[1:])之所以达不到预期,是因为agg(聚合)方法的设计目标是对每个分组生成单个聚合值(比如求和、取均值),而你返回的是切片后的Series,这会导致结果结构混乱,无法保留完整的行数据。

两种有效的解决方案

方案1:用groupby.apply直观操作分组数据

这种方法对每个分组的子DataFrame直接进行切片,逻辑清晰易懂:

df = df.groupby('id').apply(lambda x: x.iloc[1:]).reset_index(drop=True)
  • apply(lambda x: x.iloc[1:]):对每个分组的子DataFrame,提取从第二行开始的所有行
  • reset_index(drop=True):移除分组后生成的多级索引,恢复成常规的DataFrame结构

方案2:用cumcount高效筛选(适合大数据集)

这种方法通过标记分组内的行号来筛选,性能比apply更优:

# 一行完成筛选:给每个分组内的行从0编号,保留编号≠0的行
df = df[df.groupby('id').cumcount() != 0]

cumcount()会为每个分组内的行分配递增序号(从0开始),我们只保留序号不为0的行,就精准移除了每组的第一行。

两种方法都能得到你想要的结果,小数据集用方案1更直观,大数据集优先选方案2提升效率~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:41:57