如何用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
相关产品推荐
相关产品推荐

