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

Pandas:基于另一列值聚合列,获取分组最新对应值

解决分组获取最新记录的问题

嗨,这个需求我经常碰到,给你几个实用的方案,都能完美拿到每个分组下最新录入的那条记录,还能保留原DataFrame的所有数据类型~

先给你构造个示例数据方便演示:

import pandas as pd
from datetime import datetime

data = {
    'group': ['A', 'A', 'B', 'B', 'C'],
    'value': ['val1', 'val2', 'val3', 'val4', 'val5'],
    'datetime': [
        datetime(2023, 1, 1),
        datetime(2023, 1, 5),  # A组最新记录
        datetime(2023, 2, 1),
        datetime(2023, 2, 10), # B组最新记录
        datetime(2023, 3, 1)   # C组唯一记录
    ]
}
df = pd.DataFrame(data)

方法一:排序后分组取首行

思路是先把每个分组内的记录按日期降序排列,这样最新的记录会排在每个组的最前面,然后直接取每个组的第一行即可:

# 按分组升序、日期降序排序
sorted_df = df.sort_values(['group', 'datetime'], ascending=[True, False])
# 分组后取每组第一行,记得用reset_index还原索引
latest_df = sorted_df.groupby('group').first().reset_index()

这个方法直观易懂,而且能保证拿到的是原数据行,类型完全和原DataFrame一致。

方法二:用idxmax定位最新行(推荐)

这个方法效率更高,直接找到每个分组中日期最大的行的索引,再提取对应行:

# 获取每个分组中datetime最大的行的索引
max_date_indices = df.groupby('group')['datetime'].idxmax()
# 根据索引提取行,drop=True去掉原索引列
latest_df = df.loc[max_date_indices].reset_index(drop=True)

idxmax()会返回每个分组内datetime列最大值所在的行索引,用loc直接提取这些行,逻辑清晰,数据量大的时候比排序方法更快,而且同样保留原数据类型。

方法三:用transform筛选最大日期行

如果你的分组中可能存在多个日期相同的最新记录,这个方法会把这些行都保留下来,而前两种方法只会取其中一行:

# 给每行标记其所在分组的最大日期,然后筛选出等于该日期的行
latest_df = df[df['datetime'] == df.groupby('group')['datetime'].transform('max')].reset_index(drop=True)

比如如果某个分组有两行日期都是最新的,这个方法会把这两行都保留,适合需要处理这种场景的情况。

这三个方法都能满足你的需求,根据自己的场景选就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:13:47