如何用Pandas获取列中所有条目的最后出现记录
Pandas高效获取每个item_id的最新类别
原始数据集
item_id | date | cat | ---------------------------- 0 | 2020-01-01 | A | 0 | 2020-02-01 | B | 1 | 2020-04-01 | A | 2 | 2020-02-01 | C | 2 | 2021-01-01 | B |
需求
获取每个item_id对应的最新日期的类别(cat列),期望结果:
item_id | cat | --------------- 0 | B | 1 | A | 2 | B |
高效实现方法
Pandas提供了多种向量化操作方案,完全不需要遍历,效率远高于循环逻辑:
方法1:利用groupby + idxmax()
先将date列转为datetime类型(确保日期比较逻辑正确),再通过groupby找到每个item_id对应最大日期的行索引,最后筛选出目标行:
import pandas as pd # 构造数据集 df = pd.DataFrame({ 'item_id': [0, 0, 1, 2, 2], 'date': ['2020-01-01', '2020-02-01', '2020-04-01', '2020-02-01', '2021-01-01'], 'cat': ['A', 'B', 'A', 'C', 'B'] }) # 转换日期格式,保证日期排序/比较的准确性 df['date'] = pd.to_datetime(df['date']) # 获取每个item_id最新日期对应的行索引 latest_idx = df.groupby('item_id')['date'].idxmax() # 筛选目标行并整理结果 result = df.loc[latest_idx, ['item_id', 'cat']].reset_index(drop=True) print(result)
方法2:排序后groupby取首行
先按item_id升序、date降序排序,再对item_id分组并取每组第一行(即最新日期的记录):
# 排序 + 分组取首行 result = df.sort_values(['item_id', 'date'], ascending=[True, False]) \ .groupby('item_id', as_index=False).first() \ [['item_id', 'cat']]
这两种方法都是Pandas的向量化操作,内部经过性能优化,在数据量较大时优势尤为明显,可完全替代低效的遍历逻辑。
内容的提问来源于stack exchange,提问作者Gabriel Caldas
相关产品推荐
相关产品推荐

