pandas DataFrame 中行的余弦相似度

Cosine similarity of rows in pandas DataFrame

我计算了数据帧的余弦相似度,类似于以下内容:

ciiu4n4  A0111  A0112  A0113   
 A0111      14      7      6 
 A0112      16     55      3 
 A0113      15      0    112 

使用此代码:

data_cosine = mpg_data.drop(['ciiu4n4'], axis=1)
result = cosine_similarity(data_cosine)

结果我得到一个这样的数组:

[[ 1.          0.95357118  0.95814892 ]
 [ 0.95357118  1.          0.89993795 ]
 [ 0.95814892  0.89993795  1.         ]]

但是,我需要将结果作为与原始数据框相似的数据框。我无法手动完成,因为原始数据框是 600 x 600。

我需要的结果类似于:

ciiu4n4   A0111        A0112        A0113       
 A0111    1.           0.95357118   0.95814892
 A0112    0.95357118   1.           0.89993795
 A0113    0.95814892   0.89993795   1.  

我建议稍微改变一下您的方法。无需删除任何列。相反,将第一列设置为索引,计算余弦相似度,并将结果数组分配回数据框。

df = df.set_index('ciiu4n4')
df

         A0111  A0112  A0113
ciiu4n4                     
A0111       14      7      6
A0112       16     55      3
A0113       15      0    112

v = cosine_similarity(df.values)

df[:] = v
df.reset_index()

  ciiu4n4     A0111     A0112     A0113
0   A0111  1.000000  0.953571  0.958149
1   A0112  0.953571  1.000000  0.899938
2   A0113  0.958149  0.899938  1.000000

上述解决方案仅适用于行数和列数(不包括第一列)相同的情况。因此,这是另一个应该适用于任何场景的解决方案。

df = df.set_index('ciiu4n4')
v = cosine_similarity(df.values)

df = pd.DataFrame(v, columns=df.index.values, index=df.index).reset_index()
df

  ciiu4n4     A0111     A0112     A0113
0   A0111  1.000000  0.953571  0.958149
1   A0112  0.953571  1.000000  0.899938
2   A0113  0.958149  0.899938  1.000000

或者,使用 df.insert -

df = pd.DataFrame(v, columns=df.index.values)
df.insert(0, 'ciiu4n4', df.index)
df

  ciiu4n4     A0111     A0112     A0113
0   A0111  1.000000  0.953571  0.958149
1   A0112  0.953571  1.000000  0.899938
2   A0113  0.958149  0.899938  1.000000