基于条件对Pandas DataFrame去重:保留最新日期或指定值记录
Pandas 按自定义规则实现数据去重
先看原始数据:
import pandas as pd data = pd.DataFrame({ "a":["123","123","456","456"], "b":["12-09-23","13-09-23","12-09-23","13-09-23"], "c":["abc","xyz","xyz","cde"] })
需求规则:
- 常规逻辑:以
a列为分组依据,保留每组中日期列b最新的记录 - 特殊逻辑:只要
c列值为xyz,无论日期是否最新,这条记录必须保留
实现步骤
- 先把日期列
b转换成可比较的datetime格式,方便后续筛选最新日期:
data['b'] = pd.to_datetime(data['b'], format='%d-%m-%y')
- 拆分数据分别处理:
- 直接提取所有
c为xyz的记录,这部分全部保留 - 对
c不为xyz的记录,按a分组后筛选出每组日期最新的行
- 直接提取所有
# 提取所有c=xyz的记录 xyz_records = data[data['c'] == 'xyz'].copy() # 处理非xyz的记录,按a分组取最新日期对应的行 non_xyz_subset = data[data['c'] != 'xyz'] non_xyz_records = non_xyz_subset.loc[non_xyz_subset.groupby('a')['b'].idxmax()].reset_index(drop=True)
- 合并两部分数据,去除可能的重复(比如某条xyz记录刚好也是分组内最新日期,会重复出现),最后把日期转回原字符串格式:
# 合并数据并去重 result = pd.concat([xyz_records, non_xyz_records]).drop_duplicates() # 恢复日期为原格式 result['b'] = result['b'].dt.strftime('%d-%m-%y') # 按a列排序,让结果更规整 result = result.sort_values('a').reset_index(drop=True)
最终输出
运行后得到的结果如下:
a b c 0 123 13-09-23 xyz 1 123 13-09-23 abc 2 456 12-09-23 xyz 3 456 13-09-23 cde
内容的提问来源于stack exchange,提问作者Eashwar GV
相关产品推荐
相关产品推荐

