如何高效按组删除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
相关产品推荐
相关产品推荐

