You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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。


解决方案

方法一:分组取最大日期后关联筛选

  1. 先将日期列转换为datetime类型,避免字符串排序导致的错误
  2. 按用户分组,获取每个用户的最后购买日期
  3. 通过关联操作筛选出每个用户最后日期的所有订单记录
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:35:22