如何在Pandas DataFrame中获取客户的上一次购买商品
解决方法
你之前用df.groupby('customer').nth(0)不对,这个方法是取每个客户组的第一条记录,所以所有行都会拿到同一个值。要实现每笔交易对应客户的上一次购买商品,应该用**分组后移位(shift)**的方法:
步骤1:确保数据顺序正确(可选但推荐)
先把date列转为datetime类型,再按customer和date排序,保证交易时间顺序准确:
import pandas as pd # 构造示例DataFrame data = { 'date': ['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04', '2022-01-05'], 'customer': ['AA', 'AA', 'CC', 'CC', 'AA'], 'article': [4,7,4,8,9] } df = pd.DataFrame(data) # 转换日期格式并排序 df['date'] = pd.to_datetime(df['date']) df = df.sort_values(['customer', 'date'])
步骤2:分组移位并填充默认值
按customer分组后,对article列执行shift(1)——这个操作会把每个分组内的数据向下移动一行,当前行就能拿到上一行的商品值;组内第一行没有历史数据会得到NaN,最后用fillna(0)把空值替换成0,再转成整数类型:
df['prev_article'] = df.groupby('customer')['article'].shift(1).fillna(0).astype(int)
最终结果
执行完代码后,DataFrame会和你预期的一致:
| date | customer | article | prev_article |
|---|---|---|---|
| 2022-01-01 | AA | 4 | 0 |
| 2022-01-02 | AA | 7 | 4 |
| 2022-01-03 | CC | 4 | 0 |
| 2022-01-04 | CC | 8 | 4 |
| 2022-01-05 | AA | 9 | 7 |
内容的提问来源于stack exchange,提问作者Claudiu Stoica
相关产品推荐
相关产品推荐

