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

