Pandas如何删除按name、school分组的最后一条重复行并保留其余数据
解决方案
错误原因
你原来的代码存在3个问题:
drop_duplicates的设计逻辑是对重复的name+school组合只保留1行,不管怎么调整参数都无法实现保留分组内前N-1行的需求,本身就不适合当前场景keep=last写法错误,参数值需要加引号,应为keep='last',否则会触发语法报错drop_duplicates默认不会修改原DataFrame,你没有把操作后的结果赋值回变量,打印原df自然看不到变化
正确实现
用groupby对每个分组单独处理即可,逻辑非常直观:
# 按name、school分组,分组长度大于1的去掉最后一行,否则保留全部 df = df.groupby(['name', 'school'], group_keys=False).apply(lambda x: x.iloc[:-1] if len(x) > 1 else x) print(df)
运行后输出结果和你的预期完全一致:
name school marks 0 tom HBS 55 1 tom HBS 54 3 mark HBS 28 5 lewis HBS 88
如果你不想用lambda写法,也可以用cumcount计数实现:
group = df.groupby(['name', 'school']) # 筛选条件:要么分组只有1行,要么不是分组内的最后一行 cond = (group.cumcount() < group['name'].transform('size') - 1) | (group['name'].transform('size') == 1) df = df[cond]
内容的提问来源于stack exchange,提问作者hacaho
相关产品推荐
相关产品推荐

