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

如何用pandas实现按cancel_date降序去重、取每组最新记录

Pandas 实现分组取每组最新记录方案

方法1:排序+去重(高效简洁)

先对数据按id升序、cancel_date降序排序,之后按id字段去重,保留每个id的第一条记录即可,代码如下:

import pandas as pd

# 示例数据构造
df = pd.DataFrame({
    'id': [1, 1, 2],
    'cancel_date': ['2021-03-02', '2021-01-01', '2021-02-01'],
    'type_of_fruit': ['apple', 'apple', 'orange']
})

# 1. 先将cancel_date转为datetime类型,保证排序正确性
df['cancel_date'] = pd.to_datetime(df['cancel_date'])

# 2. 排序后按id去重,保留每组第一条
res = df.sort_values(['id', 'cancel_date'], ascending=[True, False]).drop_duplicates(subset='id', keep='first')

方法2:窗口函数实现(和SQL逻辑完全对齐)

完全对标你提供的SQL中rank() over(partition by id order by cancel_date desc)的逻辑实现,代码如下:

# 1. 转换日期类型
df['cancel_date'] = pd.to_datetime(df['cancel_date'])

# 2. 分组排名
df['rank'] = df.groupby('id')['cancel_date'].rank(method='min', ascending=False)

# 3. 筛选排名为1的记录,删除辅助rank列
res = df[df['rank'] == 1].drop(columns='rank')

参数说明:如果需要和SQL的row_number()逻辑一致,避免同一个id存在多条相同cancel_date记录时返回多条结果,可将rank方法的method参数改为'first'

内容的提问来源于stack exchange,提问作者queen of spades

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 15:54:05