如何在DataFrame透视结果中获取高分Item的字符串值?
解决按userID分组提取对应最高分Item的问题
针对你的需求——按userID维度聚合,获取每个用户得分最高的Item,不能直接用常规的pivot聚合字符串(会取字典序最大值而非Score对应的Item),可以用以下几种方法实现:
方法一:排序去重法
先按userID分组内的Score降序排序,再保留每个userID的第一条记录(即得分最高的Item):
import pandas as pd # 假设你的数据存储在df中 # 按userID升序、Score降序排序 df_sorted = df.sort_values(['userID', 'Score'], ascending=[True, False]) # 保留每个userID的首条记录,只保留需要的列 result = df_sorted.drop_duplicates(subset='userID')[['userID', 'Item']] # 转成类似透视表的格式(userID为索引,Item为单独列) result_pivot = result.set_index('userID').rename(columns={'Item': 'Top_Item'})
方法二:使用idxmax定位法
通过groupby找到每组中Score最大值对应的行索引,再提取对应Item:
# 获取每个userID分组中Score最大的行的索引 max_score_indices = df.groupby('userID')['Score'].idxmax() # 根据索引提取目标行,整理成目标格式 result = df.loc[max_score_indices, ['userID', 'Item']].set_index('userID').rename(columns={'Item': 'Top_Item'})
处理多个Item同分的情况
如果同一个用户有多个Item得分相同且都是最高分,可以用自定义聚合函数把这些Item拼接起来:
def get_top_items(group): max_score = group['Score'].max() # 把所有最高分的Item用逗号拼接,也可以换成其他分隔符 return ','.join(group[group['Score'] == max_score]['Item']) # 分组聚合得到结果 result = df.groupby('userID').apply(get_top_items).reset_index(name='Top_Items')
内容的提问来源于stack exchange,提问作者Zeir
相关产品推荐
相关产品推荐

