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

Pandas使用groupby按条件去重 保留每组最新日期行

pandas按分组保留最新日期行实现方案

需求说明

存在包含重复分组数据的DataFrame,需按nm字段分组,每组保留Dt列对应日期最新的行,需兼容Dt列中存在的空字符串、全空格字符串、np.nan这类无效日期值。
初始测试数据如下:

import pandas as pd
import numpy as np

df = pd.DataFrame({
               'id': [0, 1, 2, 3, 4, 5],
               'nm': ['A','A','A','B','B','B'],
               'Rev': ['$10','$20','$30','$40','$50','$60'],
               'Exp': ['$2','$4','$6','$8','$10','$12'],
               'Dt': ['2019-03-01', '2020-09-30', np.nan, '2021-09-30', '2022-04-01', ' ']
             })

预期输出:

id nm Rev Exp Dt  
1  A  $20 $4  2020-09-30
4  B  $50 $10 2022-04-01

实现逻辑

  • 先清洗日期列:将Dt列中的空值、全空格字符串统一替换为np.nan,再转换为datetime类型,无效值会自动转为pandas的空时间类型NaT,不会参与日期大小比较
  • 按日期升序排序整个DataFrame,保证日期越新的行位置越靠后
  • 按nm分组后取每组最后1行,即为每组日期最新的有效行

完整代码

# 清洗Dt列,处理无效日期值
df['Dt'] = pd.to_datetime(df['Dt'].replace(r'^\s*$', np.nan, regex=True))

# 排序后分组取每组最后一行
result = df.sort_values(by='Dt').groupby('nm', as_index=False).tail(1)

运行结果

执行后输出的result与预期完全一致:

id nm  Rev  Exp         Dt
1   1  A  $20   $4 2020-09-30
4   4  B  $50  $10 2022-04-01

注:该写法会自动跳过日期列的无效空值,不需要额外写过滤空值的逻辑,若同组存在多个相同最新日期的行,会默认保留排序后位置靠后的行。

内容的提问来源于stack exchange,提问作者kms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:06:23