创建具有相似索引值的列

Create columns having similarity index values

如何创建列来分别显示每一行的相似性指数?

这个代码

def func(name):
    matches = try_test.apply(lambda row: (fuzz.partial_ratio(row['name'], name) >= 85), axis=1)
    return [try_test.word[i] for i, x in enumerate(matches) if x]

try_test.apply(lambda row: func(row['name']), axis=1)

returns 个符合条件 >=85 的索引。但是,我也有兴趣通过将每个字段与所有其他字段进行比较来获得这些值。

数据集是

try_test = pd.DataFrame({'word': ['apple', 'orange', 'diet', 'energy', 'fire', 'cake'], 
                         'name': ['dog', 'cat', 'mad cat', 'good dog', 'bad dog', 'chicken']})

不胜感激。

预期输出(值只是一个例子)

    word       name        sim_index1 sim_index2 sim_index3 ...index 6
  apple         dog             100       0
  orange        cat                      100 
 ...           mad cat                   0.6           100

在对角线上有一个值 100,因为我正在比较狗和狗,... 如果您认为更好,我可能还会考虑另一种方法。

IIUC,你可以稍微改变你的功能来得到你想要的:

def func(name):
    return try_test.apply(lambda row: (fuzz.partial_ratio(row['name'], name)), axis=1)

print(try_test.apply(lambda row: func(row['name']), axis=1))
     0    1    2    3    4    5
0  100    0   33  100  100    0
1    0  100  100    0   33   33
2   33  100  100   29   43   14
3  100    0   29  100   71    0
4  100   33   43   71  100    0
5    0   33   14    0    0  100

也就是说,超过一半的计算是不必要的,因为结果是对称矩阵,对角线是 100。所以如果你的数据更大,那么你可以对行进行 partial_ratio在当前行之前。添加 reindex 然后使用 T(转置)和 np.diag 创建完整矩阵,你可以这样做:

def func_pr (row):
    return (try_test.loc[:row.name-1, 'name']
                    .apply(lambda name: fuzz.partial_ratio(name, row['name'])))

#start at index 1 (second row)
pr = (try_test.loc[1:].apply(func_pr, axis=1)
         .reindex(index=try_test.index, 
                  columns=try_test.index)
         .fillna(0)
         .add_prefix('sim_idx')
     )

#complete the result with transpose and diag
pr += pr.to_numpy().T + np.diag(np.ones(pr.shape[0]))*100

# concat
res = pd.concat([try_test, pr.astype(int)], axis=1)

你得到

print(res)
     word      name  sim_idx0  sim_idx1  sim_idx2  sim_idx3  sim_idx4  \
0   apple       dog       100         0        33       100       100   
1  orange       cat         0       100       100         0        33   
2    diet   mad cat        33       100       100        29        43   
3  energy  good dog       100         0        29       100        71   
4    fire   bad dog       100        33        43        71       100   
5    cake   chicken         0        33        14         0         0   

   sim_idx5  
0         0  
1        33  
2        14  
3         0  
4         0  
5       100