如何用Pandas Shift函数高效获取客户上次购买价格(无需Join)
解决方案
你可以直接通过**分组后对price列使用shift(1)**实现需求,全程不需要Join操作,代码简洁且效率更高:
步骤与代码示例
import pandas as pd # 构造原始数据表 data = { 'customer_id': ['a', 'b', 'c', 'a', 'b', 'a'], 'date': ['4/11/2022', '5/11/2022', '5/11/2022', '6/11/2022', '6/11/2022', '7/11/2022'], 'price': [10, 20, 30, 20, 20, 30] } df = pd.DataFrame(data) # 可选但推荐:将日期列转为datetime类型,确保分组内记录按时间排序 df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y') # 核心操作:分组后对price列执行shift,生成上次购买记录 df['last_purchase'] = df.groupby('customer_id')['price'].shift(1) # 可选:将日期转回原字符串格式 df['date'] = df['date'].dt.strftime('%d/%m/%Y') print(df)
关键说明
groupby('customer_id')['price'].shift(1)会在每个客户的独立分组内,把price列的数值向下偏移一行:当前行的last_purchase自动对应同一客户上一条记录的price,首次购买记录则填充NaN,完全匹配目标表要求。- 转换日期为datetime类型是为了避免字符串排序导致的时间顺序错误,确保分组内的记录严格按购买时间排列。
运行上述代码后,输出结果即为你需要的目标数据表。
内容的提问来源于stack exchange,提问作者TheTwo
相关产品推荐
相关产品推荐

