如何用Python生成包含每个用户最后订单的表格?
问题:提取每个用户的最后一次订单数据
我正在完成一项练习:从包含UserID、购买日期、商品ID、InvoiceID及其他字段的模拟原始表中,生成仅包含每个用户最后一次订单的表格。要求每个用户对应一个InvoiceID,该订单下可包含多个商品,目前尚未找到可行的Python实现方法。
我尝试用以下代码获取每个用户的最后订单,但未能通过筛选生成符合要求的表格,无法将用户最后购买日期的所有商品与对应的InvoiceID正确对齐:
import pandas as pd df = pd.DataFrame({'user': [1, 2, 3, 1, 1, 2, 2], 'product':['A','B','C', 'A','C','D','A'], 'invoice': [101, 102, 103, 104, 104, 105, 105], 'date': ['1/02/2023', '1/03/2023', '1/04/2023','1/05/2023', '1/05/2023','1/06/2023','1/06/2023']}) df['lastorder'] = df.groupby(['user'])['date'].\ apply(lambda x: x.shift())
期望得到的表格应仅包含用户1、2、3的最后订单数据,分别对应日期1/05/2023、1/06/2023、1/04/2023,以及InvoiceID 104、105、103。
解决方案
方法一:分组取最大日期后关联筛选
- 先将日期列转换为datetime类型,避免字符串排序导致的错误
- 按用户分组,获取每个用户的最后购买日期
- 通过关联操作筛选出每个用户最后日期的所有订单记录
import pandas as pd df = pd.DataFrame({'user': [1, 2, 3, 1, 1, 2, 2], 'product':['A','B','C', 'A','C','D','A'], 'invoice': [101, 102, 103, 104, 104, 105, 105], 'date': ['1/02/2023', '1/03/2023', '1/04/2023','1/05/2023', '1/05/2023','1/06/2023','1/06/2023']}) # 转换日期列为datetime类型,确保日期比较准确 df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y') # 按user分组,提取每个用户的最后购买日期 user_last_dates = df.groupby('user')['date'].max().reset_index() # 关联原始表,筛选出符合条件的记录 final_result = df.merge(user_last_dates, on=['user', 'date']) print(final_result)
运行结果:
user product invoice date 0 1 A 104 2023-05-01 1 1 C 104 2023-05-01 2 2 D 105 2023-06-01 3 2 A 105 2023-06-01 4 3 C 103 2023-04-01
方法二:使用transform标记筛选
这种方法更简洁,直接为每行数据标记是否属于该用户的最后订单:
import pandas as pd df = pd.DataFrame({'user': [1, 2, 3, 1, 1, 2, 2], 'product':['A','B','C', 'A','C','D','A'], 'invoice': [101, 102, 103, 104, 104, 105, 105], 'date': ['1/02/2023', '1/03/2023', '1/04/2023','1/05/2023', '1/05/2023','1/06/2023','1/06/2023']}) df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y') # 标记每行是否为该用户的最后订单日期 df['is_last_order'] = df['date'] == df.groupby('user')['date'].transform('max') # 筛选出最后订单记录并移除标记列 final_result = df[df['is_last_order']].drop('is_last_order', axis=1) print(final_result)
两种方法都能准确获取每个用户最后一次订单的所有商品及对应的InvoiceID,满足需求。
内容的提问来源于stack exchange,提问作者CAMILO RUBIO
相关产品推荐
相关产品推荐

