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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:55:22