pandas DataFrame中行的余弦相似度

时间:2018-01-07 00:01:26

标签: python pandas dataframe cosine-similarity

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

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.  

1 个答案:

答案 0 :(得分: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