如何从Pandas DataFrame中按订单日期获取商品最新采购价?
解决Pandas按日期获取每个商品最后采购价的问题
原始数据
import pandas as pd data = { 'order_date': ['2022-01-02' , '2022-05-03' , '2022-02-01' , '2022-09-30'], 'order_id' : ['001' , '002' , '003' , '004'], 'item_code': ['12-05', '13-05', '13-05' , '12-05' ], 'price': [20, 21, 19,17], } df_purchase = pd.DataFrame(data)
需求
按order_date筛选出每个item_code的最新采购记录,包含对应的order_id和price,预期结果如下:
order_date order_id item_code price 0 2022-05-03 002 13-05 21 1 2022-09-30 004 12-05 17
解决方案
方法1:排序后去重(直观易懂)
先将日期列转换为datetime类型,再按商品编码、日期降序排序,最后保留每个商品的第一条记录:
# 转换日期列为datetime类型 df_purchase['order_date'] = pd.to_datetime(df_purchase['order_date']) # 排序后去重 result = df_purchase.sort_values( by=['item_code', 'order_date'], ascending=[True, False] ).drop_duplicates(subset='item_code', keep='first').reset_index(drop=True) print(result)
方法2:分组取最大索引(高效适合大数据)
通过分组获取每个商品最新日期对应的行索引,直接提取目标行:
# 转换日期列为datetime类型 df_purchase['order_date'] = pd.to_datetime(df_purchase['order_date']) # 获取每个商品最新日期的行索引 latest_idx = df_purchase.groupby('item_code')['order_date'].idxmax() # 提取目标行 result = df_purchase.loc[latest_idx].reset_index(drop=True) print(result)
说明
- 必须先将
order_date转换为datetime类型,否则字符串排序逻辑会不符合日期大小的实际规则。 - 方法2性能更优,大数据量场景下可以避免全量排序的额外开销。
内容的提问来源于stack exchange,提问作者Bashar
相关产品推荐
相关产品推荐

