Pandas中按ID列分组后如何删除每个分组的最后2行?
Pandas按ID分组删除每组最后2行的实现方案
可直接运行的实现方法
- 方法1:直接定位待删除行,代码最简短
利用groupby.tail(2)可直接取出每个分组的最后2行数据,拿到这些行的索引后从原数据集删除,完全匹配“反向删除、保留剩余行”的需求:
边界逻辑:如果某个ID分组本身总行数≤2,删除后该分组不会留存任何行,完全符合“删除最后2行”的预期,不存在逻辑bug。# 收集每个ID分组最后2行的索引 drop_index = df.groupby('ID').tail(2).index # 删除对应行得到最终结果 df_res = df.drop(drop_index) - 方法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
相关产品推荐
相关产品推荐

