Pandas如何基于单列特定类别去重并保留最后一条记录?
实现单列特定类别去重并保留最后一条记录
原始数据
首先定义目标DataFrame:
import pandas as pd data = pd.DataFrame({"col1": ["a", "a", "a", "a", "a", "a"], "col2": [0,0,0,1,1, 1], "col3": [1,2,3,4,5, 6]})
原始数据如下:
col1 col2 col3 0 a 0 1 1 a 0 2 2 a 0 3 3 a 1 4 4 a 1 5 5 a 1 6
需求说明
需要对col2 == 1的行进行去重,仅保留该类别下的最后一条记录;col2 == 0的所有行需完整保留,最终期望输出:
col1 col2 col3 0 a 0 1 1 a 0 2 2 a 0 3 5 a 1 6
原有代码问题
原代码data[~(data.duplicated(["col2"]) & data.col2.eq(1))]仅能保留col2 ==1的第一条记录,无法满足保留最后一条的需求。
解决方案
方法一:利用duplicated的keep='last'参数
通过标记col2=1分组中除最后一行外的重复项,再过滤掉这些标记行:
# 生成需要删除的行的掩码:col2=1且不是该分组最后一行的重复项 mask = data.duplicated(subset=["col2"], keep='last') & data.col2.eq(1) # 保留未被标记的行 result = data[~mask]
方法二:分组后针对性筛选
对col2分组,col2=1的组仅取最后一行,其他组保留全部行:
result = data.groupby('col2', group_keys=False).apply( lambda x: x.tail(1) if x.name == 1 else x )
两种方法均可得到符合期望的输出结果。
内容的提问来源于stack exchange,提问作者Ailurophile
相关产品推荐
相关产品推荐

