使用User将此用户类别分数转换为User-Top3-Category分数数据框架,并且在Python Pandas Dataframe中有3个最大类别名称
Input DataFrame
user_id cat_1 cat_2 cat_3 cat_4 cat_5 cat_6
1 0.10 0.2 0.20 0.12 0.7 0.6
2 0.6 0.20 0.12 0.15 0.13 0.11
3 0.11 0.10 0.8 0.12 0.3 0.7
4 0.2 0.11 0.12 0.6 0.9 0.21
5 0.9 0.8 0.5 0.1 0.0 0.11
Desired Output DataFrame
user_id top_3_categories
1 [cat_3, cat_4, cat_1]
2 [cat_2, cat_4, cat_3]
3 [cat_4, cat_1, cat_2]
4 [cat_6, cat_3, cat_2]
5 [cat_6, cat_1, cat_2]
答案 0 :(得分:1)
使用numpy.argsort
进行排名,按每行的值排序,并广播列名称,每行仅过滤3个值:
df = df.set_index('user_id')
arr = df.columns.values[np.argsort(-df.values)[:, -3:]].tolist()
df1 = pd.DataFrame({'user_id': df.index, 'top_3_categories':arr})
print (df1)
user_id top_3_categories
0 1 [cat_3, cat_4, cat_1]
1 2 [cat_5, cat_3, cat_6]
2 3 [cat_4, cat_1, cat_2]
3 4 [cat_1, cat_3, cat_2]
4 5 [cat_6, cat_4, cat_5]
或者:
arr = df.columns.values[np.argsort(-df.values)[:, :3]].tolist()
df1 = pd.DataFrame({'user_id': df.index, 'top_3_categories':arr})
print (df1)
user_id top_3_categories
0 1 [cat_5, cat_6, cat_2]
1 2 [cat_1, cat_2, cat_4]
2 3 [cat_3, cat_6, cat_5]
3 4 [cat_5, cat_4, cat_6]
4 5 [cat_1, cat_2, cat_3]