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

