Pandas按user_id分组后获取每组购买次数最高的product_id及对应值方法
实现方案
你可以通过以下两种常用的pandas方法实现需求,默认你的原始数据集已读入为df,且包含user_id、product_id、uxp_total_bought三个字段:
方法1:排序后去重(逻辑直观,适合中小数据集)
import pandas as pd # 按user_id升序、购买次数降序排序,同一user_id下购买次数最高的行排在最前 df_sorted = df.sort_values(by=['user_id', 'uxp_total_bought'], ascending=[True, False]) # 每个user_id仅保留第一行,提取指定的三列 result = df_sorted.drop_duplicates(subset='user_id', keep='first')[['user_id', 'product_id', 'uxp_total_bought']] # 重置索引便于后续使用 result = result.reset_index(drop=True)
方法2:分组取最大值索引(运算效率更高,适合大数据集)
# 提取每个user_id分组下购买次数最大值对应的行索引 max_buy_idx = df.groupby('user_id')['uxp_total_bought'].idxmax() # 按索引取对应行,筛选指定列 result = df.loc[max_buy_idx, ['user_id', 'product_id', 'uxp_total_bought']].reset_index(drop=True)
特殊场景处理:保留并列最高购买次数的所有产品
如果同一个user_id有多个产品购买次数同为最大值,需要全部保留的话可以用以下逻辑:
# 为每行新增对应user_id分组的最高购买次数标识 df['group_max_buy'] = df.groupby('user_id')['uxp_total_bought'].transform('max') # 筛选出购买次数等于分组最大值的行 result = df[df['uxp_total_bought'] == df['group_max_buy']][['user_id', 'product_id', 'uxp_total_bought']].reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Dimitris Tagkoulis
相关产品推荐
相关产品推荐

