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

如何按指定规则去除Pandas DataFrame中的重复数据?

问题描述

现有如下Pandas DataFrame:

import pandas as pd

df = pd.DataFrame({'id_SAP_transaction': [1, 2, 2, 3, 3],
                    'checkout_security': ['2023-12-15', pd.NaT, 
                                          '2023-12-01', pd.NaT, 
                                          '2023-11-30'],
                    'nopol': ['AA123', 'BB456', 'CC789', 'DD101', 
                              'EE234']})

processed_df = process_dataframe(df.copy())

需要按照以下规则对id_SAP_transaction字段去重:

  • 若ID重复但存在非NaT的checkout_security日期,保留含有效日期的记录;
  • 若同一ID的checkout_security全为NaT,任选其中一条记录;
  • 若同一ID的checkout_security全为有效日期,保留最新日期的记录。

当前编写的process_dataframe函数运行后不符合预期,保留了多余的重复记录:

预期结果:

id_SAP_transaction checkout_security  nopol
0                   1        2023-12-15  AA123
2                   2        2023-12-01  CC789
4                   3        2023-11-30  EE234

实际结果:

id_SAP_transaction checkout_security  nopol
0                   1        2023-12-15  AA123
2                   2        2023-12-01  CC789
4                   3        2023-11-30  EE234
1                   2               NaT  BB456
3                   3               NaT  DD101
解决方案

直接用分组排序加筛选的方式就能满足需求,修改后的process_dataframe函数代码如下:

def process_dataframe(df):
    # 先把日期列转成datetime类型,避免排序出问题
    df['checkout_security'] = pd.to_datetime(df['checkout_security'])
    
    # 给每条记录算优先级:非空日期优先级高于空值,日期越新优先级越高
    df['priority'] = df['checkout_security'].notna() * 2 + df['checkout_security'].rank(method='first', ascending=False)
    
    # 按ID分组,挑出每组优先级最高的第一条记录,最后删掉临时的priority列
    processed_df = df.sort_values(['id_SAP_transaction', 'priority'], ascending=[True, False]) \
                     .groupby('id_SAP_transaction', as_index=False) \
                     .first() \
                     .drop(columns='priority')
    
    return processed_df

代码说明:

  1. 日期类型转换:确保checkout_security是标准datetime格式,避免排序逻辑出错;
  2. 优先级计算:
    • 非NaT记录先获得基础优先级2,NaT记录为0,保证空值不会抢占有效日期的记录;
    • 叠加日期的降序排名,让同ID下最新的日期记录优先级最高;
  3. 分组筛选:先按ID和优先级排序,再分组取每组第一条,正好符合规则要求保留的记录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 15:02:34