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

如何在Python中按DataFrame的id分组删除每组指定末尾行?

实现方法

你可以通过分组过滤的方式实现这个需求,核心思路是先定义每个id需要删除的末尾行数,再对每个id对应的分组保留前「总行数 - 需删除行数」的记录,最后合并所有分组即可。

完整代码

import pandas as pd

# 原数据集创建
data = {'id': [1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1,
               2, 2,2,2,2,
               3, 3, 3, 3, 3, 3,
               4, 4,4,4,4,4,4,4,
               5, 5, 5, 5, 5,5, 5, 5,5],
        'cycle': [1,2, 3, 4, 5,6,7,8,9,10,11,
                  1,2, 3,4,5,
                  1,2, 3, 4, 5,6,
                  1,2,3,4,5,6,7,8,
                  1,2, 3, 4, 5,6,7,8,9,],
        'Salary': [7, 7, 7,8,9,10,11,12,13,14,15,
                   4, 5,6,7,8,
                   8,9,10,11,12,13,
                   8,1,2,3,4,5,6,7,
                   7, 7,9,10,11,12,13,14,15,],
        'Children': ['No', 'Yes', 'Yes', 'Yes', 'Yes', 'No','No', 'Yes', 'Yes', 'Yes', 'No',
                     'Yes', 'No', 'Yes', 'No', 'Yes',
                     'No','Yes', 'Yes', 'No','No', 'Yes',
                     'Yes','Yes', 'Yes', 'No','No', 'Yes', 'Yes', 'Yes',
                      'No',  'Yes', 'No', 'No', 'Yes', 'Yes', 'Yes', 'Yes', 'No',],
        'Days': [123, 128, 66, 66, 120, 141, 52,96, 120, 141, 52,
                 96, 120,128, 66, 120,
                 15,123, 128, 66, 120, 141,
                 141,128, 66, 123, 128, 66, 120,141, 
                 123, 128, 66, 123, 128, 66, 120, 141, 52,],
        }

df = pd.DataFrame(data)

# 定义每个id需要删除的末尾行数映射
drop_last_map = {
    1: 4,
    2: 2,
    3: 3,
    4: 5,
    5: 6
}

# 分组过滤:对每个id的分组,保留前(len(group) - drop_num)行
filtered_df = df.groupby('id').apply(
    lambda group: group.iloc[:len(group) - drop_last_map[group.name]]
).reset_index(drop=True)

# 查看结果
print("处理后的DataFrame:\n", filtered_df)

代码解释

  • 映射字典:drop_last_map明确了每个id对应的末尾删除行数,逻辑清晰且便于后续修改。
  • 分组过滤:通过groupby('id')按id拆分数据,再用apply对每个分组执行过滤:group.iloc[:len(group) - drop_last_map[group.name]],其中group.name是当前分组的id值,计算出需要保留的行数后,截取前N行即可。
  • 重置索引:reset_index(drop=True)用于移除分组生成的多级索引,让结果回归普通DataFrame结构。

结果验证

处理后各id保留的行数符合预期:

  • id1:11-4=7行
  • id2:5-2=3行
  • id3:6-3=3行
  • id4:8-5=3行
  • id5:9-6=3行

你可以执行filtered_df.groupby('id').size()来快速验证每个id的行数是否正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 06:43:18