如何按指定规则去除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
代码说明:
- 日期类型转换:确保
checkout_security是标准datetime格式,避免排序逻辑出错; - 优先级计算:
- 非NaT记录先获得基础优先级2,NaT记录为0,保证空值不会抢占有效日期的记录;
- 叠加日期的降序排名,让同ID下最新的日期记录优先级最高;
- 分组筛选:先按ID和优先级排序,再分组取每组第一条,正好符合规则要求保留的记录。
内容的提问来源于stack exchange,提问作者Daily Activity2410
相关产品推荐
相关产品推荐

