pandas 数据框转换-基于得分值创建分级数据框

xienkqul  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(116)

写一个更具解释性的问题标题有点难,但这里有一个更详细的解释。
我有一个二次数据框,如下所示:索引名=列名,对于每个图像,都有一个相似性得分。对于每个图像名,我需要提取前n个最相似的图像(按得分排序),并将它们存储在一个不占用太多空间的数据框中。

name_A.jpg     name_B.jpg     name_C.jpg     name_D.jpg   ...

name_A.jpg     1.000000       0.725098       0.291748       0.444336
name_B.jpg     0.725098       1.000000       0.255371       0.482178
name_C.jpg     0.291748       0.255371       1.000000       0.382812
name_D.jpg     0.444336       0.482178       0.382812       1.000000
name_E.jpg     0.197998       0.276611       0.183594       0.242065
name_F.jpg     0.309570       0.292236       0.327148       0.387695
name_G.jpg     0.302490       0.280273       0.339844       0.377197
name_H.jpg     0.261475       0.278076       0.258301       0.323975
name_J.jpg     0.243164       0.261963       0.304932       0.314453
name_K.jpg     0.269043       0.254639       0.247681       0.259766
name_L.jpg     0.251465       0.238892       0.227539       0.233887
name_M.jpg     0.287354       0.299805       0.216553       0.259766
name_N.jpg     0.413818       0.460938       0.239136       0.358398
name_O.jpg     0.394043       0.489258       0.293701       0.526855
name_P.jpg     0.262451       0.235229       0.224487       0.210083
name_Q.jpg     0.124634       0.137695       0.095032       0.142944
name_R.jpg     0.173218       0.187134       0.203491       0.194092
...

因此,所需的输出如下所示:

0              1              2              3              ....          n
name_A.jpg     name_B.jpg     name_D.jpg     name_N.jpg     name_O.jpg     
name_B.jpg
name_C.jpg
name_D.jpg
...

因此,如果我在网站上查看name_A.jpg,推荐的产品是name_b.jpg, name_D.jpg, name_N.jpg, name_O.jpg ......在我的情况下,我有大约300,000张图像,我想显示前n = 50张最相似的图像,因此所需的输出 Dataframe 将具有300,000 x 50的尺寸。
当然,我可以只对每一列进行子集化,按降序使用sort(),并对前50行进行封顶。然而,这需要一个for循环做同样的事情300 000次。还有其他更快的方法吗?

abithluo

abithluo1#

将列和DataFrame的值转换为numpy数组,并通过将数组转换为负值来获取降序值的位置,然后过滤输出第一个top1值(因为总是1),并将前N列值获取为新的DataFrame

arr = df.to_numpy()
cols = df.columns.to_numpy()

N = 3
df = pd.DataFrame(cols[np.argsort(-arr)[:, 1:N+1]], index=df.index)
print (df.head(4))
                     0           1           2
name_A.jpg  name_B.jpg  name_D.jpg  name_C.jpg
name_B.jpg  name_A.jpg  name_D.jpg  name_C.jpg
name_C.jpg  name_D.jpg  name_A.jpg  name_B.jpg
name_D.jpg  name_B.jpg  name_A.jpg  name_C.jpg

相关问题