如何在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
相关产品推荐
相关产品推荐

