将此Weigth / Score数据框转换为Coulmn名称列表,并根据其在Python Pandas中的Weigth / Score矩阵格式数据框进行排序

时间:2019-04-25 05:11:35

标签: python-3.x pandas dataframe scikit-learn data-science

  • 使用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]   
    

1 个答案:

答案 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]