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
相关产品推荐
相关产品推荐

