我计算了数据帧的余弦相似度,类似于以下内容:
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.
答案 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