Pandas按user_id分组求product_id众数,平局取最新created_at对应值的实现方法
需求实现方案
前置处理
首先确保created_at列转换为datetime类型,方便后续时间比较:
import pandas as pd df['created_at'] = pd.to_datetime(df['created_at'])
核心实现代码
# 按用户+商品聚合,统计每个商品的购买次数、对应最新下单时间 user_prod_stats = df.groupby(['user_id', 'product_id']).agg( buy_cnt = ('product_id', 'count'), latest_time = ('created_at', 'max') ).reset_index() # 按购买次数降序、最新下单时间降序排序,取每个用户的第一条记录 result = user_prod_stats.sort_values( by = ['buy_cnt', 'latest_time'], ascending = [False, False] ).groupby('user_id', as_index=False).head(1)[['user_id', 'product_id']]
输出结果
运行代码后得到的结果完全符合要求:
| user_id | product_id |
|---|---|
| 1 | 200 |
| 2 | 300 |
| 3 | 400 |
方案优势
该方案使用pandas原生的聚合、排序操作,均为向量化实现,比在groupby中自定义lambda函数的性能高很多,数据量越大优势越明显;同时逻辑分层清晰,后续如果要调整排序规则(比如次数相同选最早下单的商品),只需要修改排序参数即可。
内容的提问来源于stack exchange,提问作者LucyDrops
相关产品推荐
相关产品推荐

