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

如何使用pandas筛选每个item_id对应最早、最晚日期的行

pandas 筛选每个item_id对应最早、最晚日期的记录

前置准备

首先确保date字段为datetime类型,字符串格式日期直接排序可能出现逻辑错误,加载数据后先做类型转换:

import pandas as pd

df = pd.read_csv("your_data_path.csv")
df["date"] = pd.to_datetime(df["date"])

实现方案

方案1:排序后分组取首尾(推荐,大数据量性能更好)

先按item_id分组、组内按日期升序排列,直接取每组第一条(最早日期)和最后一条(最晚日期)即可:

# 按item_id、日期升序排序
df_sorted = df.sort_values(by=["item_id", "date"], ascending=True)
# 分组取每组第1条、倒数第1条
result = df_sorted.groupby("item_id", as_index=False).nth([0, -1])

方案2:匹配分组日期极值(逻辑直观易理解)

先计算每个item_id对应的最早、最晚日期值,再筛选原表中日期匹配极值的记录:

# 计算每个item_id的最早、最晚日期
group_extremes = df.groupby("item_id")["date"].agg(min_date="min", max_date="max").reset_index()
# 关联回原表
df_merged = df.merge(group_extremes, on="item_id")
# 筛选符合极值的行,删除临时列
result = df_merged[(df_merged["date"] == df_merged["min_date"]) | (df_merged["date"] == df_merged["max_date"])].drop(columns=["min_date", "max_date"])

输出结果

两种方案得到的结果完全匹配需求:

item_idfavoritedate
104997782022-06-09
104997782022-06-12
16119241682022-06-09
16119241682022-06-13

注意:如果单个item_id下存在多条记录的date同时等于最早/最晚日期,上述方案会保留所有符合极值条件的行;如果每个极值仅需保留1条,可在排序后提前去重,或使用drop_duplicates处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:51:44