You need to enable JavaScript to run this app. Pandas如何按user_id分组选取每组transaction_id最大的对应行
优惠活动
大模型
产品
解决方案
定价
更多

Pandas如何按user_id分组选取每组transaction_id最大的对应行

Pandas实现按用户维度提取最大交易ID对应行的方法

针对题中给出的包含user_id、spend、transaction_id字段的DataFrame,常用的可落地实现有3种,各有适用场景:

方案1:排序+按用户去重(最直观易理解)

核心逻辑是先把全表按交易ID从大到小排序,同一用户下交易ID最大的行会自然排在同用户组的最前面,之后按用户ID去重保留第一行即可。

# 按transaction_id降序排序
sorted_df = my_df.sort_values(by="transaction_id", ascending=False)
# 按user_id去重,保留每个用户排序后的第一行
result = sorted_df.drop_duplicates(subset="user_id", keep="first")

这个方法代码可读性强,新手一眼就能理清逻辑,常规数据量下性能充足,不会出现列值错配的问题。

方案2:取分组最大值的索引定位原行(大场景高性能)

通过分组直接定位每个用户下交易ID最大的行在原表中的位置,再通过索引直接取原表数据,避免聚合运算的额外开销。

# 获取每个user_id组内transaction_id最大的行的索引位置
max_row_index = my_df.groupby("user_id")["transaction_id"].idxmax()
# 从原表取出对应索引的行
result = my_df.loc[max_row_index]

注意避坑:不要直接用分组聚合max的方式拼结果——类似my_df.groupby("user_id")[["spend","transaction_id"]].max()的写法,会分别计算每个字段的最大值,取出的spend是该用户所有消费的最大值,不是和最大交易ID绑定的那笔消费,和需求目标的结果不一致,是非常高频的踩坑点。

方案3:transform做值匹配(适合保留同值重复行的场景)

如果同一用户下存在多笔transaction_id等于组内最大值的交易,需要全部返回的话,用transform的方式不会漏数据。

# 为每一行标记所属用户组的最大transaction_id值
my_df["group_max_trans"] = my_df.groupby("user_id")["transaction_id"].transform("max")
# 筛选当前行的transaction_id等于组内最大值的行,删除临时标记列
result = my_df[my_df["transaction_id"] == my_df["group_max_trans"]].drop(columns=["group_max_trans"])

三种方法运行后,都能得到题中期望的结果:即user_id为1对应spend=77、user_id为2对应spend=44、user_id为3对应spend=12的结果表。


内容的提问来源于stack exchange,提问作者kev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 04:45:01