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

如何基于多列条件删除DataFrame重复行?含具体规则与示例

问题:按自定义条件删除DataFrame重复行

原始DataFrame

idvaluedate
001True01/01/2022 00:00:00
002False03/01/2022 00:00:00
003True03/01/2022 00:00:00
001False01/01/2022 01:30:00
001True01/01/2022 01:30:00
002True03/01/2022 00:00:00
003True03/01/2022 00:30:00
004False03/01/2022 00:30:00
005False01/01/2022 00:00:00

去重条件

  • 同一id+同一日期时间存在重复行时,保留value=True的行(如id=002)
  • 同一id+同一value存在重复行时,保留日期时间最新的行(如id=003)
  • 同一id存在多行时,优先保留日期最新且value=True的行(如id=001)

期望输出

idvaluedate
001True01/01/2022 01:30:00
002True03/01/2022 00:00:00
003True03/01/2022 00:30:00
004False03/01/2022 00:30:00
005False01/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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:15:59