如何基于多列条件删除DataFrame重复行?含具体规则与示例
问题:按自定义条件删除DataFrame重复行
原始DataFrame
| id | value | date |
|---|---|---|
| 001 | True | 01/01/2022 00:00:00 |
| 002 | False | 03/01/2022 00:00:00 |
| 003 | True | 03/01/2022 00:00:00 |
| 001 | False | 01/01/2022 01:30:00 |
| 001 | True | 01/01/2022 01:30:00 |
| 002 | True | 03/01/2022 00:00:00 |
| 003 | True | 03/01/2022 00:30:00 |
| 004 | False | 03/01/2022 00:30:00 |
| 005 | False | 01/01/2022 00:00:00 |
去重条件
- 同一id+同一日期时间存在重复行时,保留
value=True的行(如id=002) - 同一id+同一value存在重复行时,保留日期时间最新的行(如id=003)
- 同一id存在多行时,优先保留日期最新且
value=True的行(如id=001)
期望输出
| id | value | date |
|---|---|---|
| 001 | True | 01/01/2022 01:30:00 |
| 002 | True | 03/01/2022 00:00:00 |
| 003 | True | 03/01/2022 00:30:00 |
| 004 | False | 03/01/2022 00:30:00 |
| 005 | False | 01/01/2022 00:00:00 |
解决方案
利用Pandas的排序+分组去重逻辑,按优先级筛选目标行:
import pandas as pd # 构造原始DataFrame data = { 'id': ['001', '002', '003', '001', '001', '002', '003', '004', '005'], 'value': [True, False, True, False, True, True, True, False, False], 'date': ['01/01/2022 00:00:00', '03/01/2022 00:00:00', '03/01/2022 00:00:00', '01/01/2022 01:30:00', '01/01/2022 01:30:00', '03/01/2022 00:00:00', '03/01/2022 00:30:00', '03/01/2022 00:30:00', '01/01/2022 00:00:00'] } df = pd.DataFrame(data) # 1. 转换日期列为datetime类型,方便排序比较 df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y %H:%M:%S') # 2. 设置优先级:value=True优先级高于False,日期越新优先级越高 df['priority'] = df['value'].map({True: 2, False: 1}) df['date_num'] = df['date'].view('int64') # 将日期转为数值用于排序 # 3. 按id分组,按优先级降序、日期数值降序排序,保留每组第一行 result = df.sort_values(by=['id', 'priority', 'date_num'], ascending=[True, False, False]) \ .drop_duplicates(subset='id', keep='first') \ .drop(columns=['priority', 'date_num']) \ .reset_index(drop=True) print(result)
逻辑说明
- 对于同一id+同一时间的重复行:
value=True的行优先级更高,排序时会被放在前面,最终保留 - 对于同一id+同一value的重复行:日期数值越大(时间越新)排得越靠前,保留最新行
- 对于同一id的多行:先筛选
value=True的行,再从中选最新日期的行,完全匹配要求
内容的提问来源于stack exchange,提问作者Luckyboy. Jupiterchen
相关产品推荐
相关产品推荐

