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

基于条件对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,无论日期是否最新,这条记录必须保留

实现步骤

  1. 先把日期列b转换成可比较的datetime格式,方便后续筛选最新日期:
data['b'] = pd.to_datetime(data['b'], format='%d-%m-%y')
  1. 拆分数据分别处理:
    • 直接提取所有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)
  1. 合并两部分数据,去除可能的重复(比如某条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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:52:33