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

