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

如何高效按组删除Pandas DataFrame中重复abc行并保留最后一行?

高效处理DataFrame中指定值的重复行保留最后一行

嘿,我有个更简洁高效的方法,不用拆分合并DataFrame就能搞定你的需求!先理清楚背景:

你的原始数据与需求

你有这样的DataFrame:

import pandas as pd

df = pd.DataFrame({
    'id': ['01', '01', '01', '01', '02', '02', '02', '03', '03', '03', '03'],
    'day': [4, 3, 2, 1, 3, 2, 1, 4, 3, 2, 1],
    'value': ['abc', 'abc', 'y', 'y', 'abc', 'x', 'x', 'abc', 'abc', 'abc', 'z']
})

你的需求是:删除value为"abc"的重复行,仅保留每个id组内最后一行"abc",最终要得到这样的结果:

id  day value
0  01    3   abc
1  01    2     y
2  01    1     y
3  02    3   abc
4  02    2     x
5  02    1     x
6  03    2   abc
7  03    1     z

你之前拆分再合并的方法确实有点绕,这里有个一步到位的高效方案:

高效解决方案

利用pandas的duplicated()方法结合布尔掩码,直接在原数据上筛选出需要保留的行:

# 标记所有value为"abc"的行
mask_abc = df['value'] == 'abc'

# 核心筛选逻辑:非abc的行全留;abc的行仅保留每个id组的最后一行
df_result = df[~(mask_abc & df.duplicated(subset=['id', 'value'], keep='last'))]

# 可选:重置索引让结果更整洁
df_result = df_result.reset_index(drop=True)

逻辑解释

  • df.duplicated(subset=['id', 'value'], keep='last'):这个方法会给每个(id, value)组合标记出除最后一行外的所有重复行。
  • 我们把这个标记和mask_abc结合,只排除那些「既是abc又是重复行」的数据,剩下的就是我们要的:所有非abc的行都保留,每个id下的最后一行abc也保留。
  • 这个方法全程在原DataFrame上操作,不需要额外拆分合并,运行效率更高,代码也更简洁易读。

运行这段代码后,得到的df_result完全符合你的期望结果!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:25:03