如何使用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_id | favorite | date |
|---|---|---|
| 1049977 | 8 | 2022-06-09 |
| 1049977 | 8 | 2022-06-12 |
| 1611924 | 168 | 2022-06-09 |
| 1611924 | 168 | 2022-06-13 |
注意:如果单个
item_id下存在多条记录的date同时等于最早/最晚日期,上述方案会保留所有符合极值条件的行;如果每个极值仅需保留1条,可在排序后提前去重,或使用drop_duplicates处理。
内容的提问来源于stack exchange,提问作者Branson
相关产品推荐
相关产品推荐

