mat*_*lde 3 python dataframe python-3.x pandas
我想计算数据帧行之间的相似度。我有一些专栏,其中包含一些人的信息。一排是一个人。看起来像这样:
print(df)
id name firstname email town age
0 1 martin pierre truc@machin.com Paris na
1 2 dupond sarah bidule@machin.com London 32
2 3 dupond sarah bidule@machin.com Berlin 32
3 4 dupond john na Madrid 45
4 5 smith na something@thing.com Paris 28
Run Code Online (Sandbox Code Playgroud)
如果至少完成了 3 列,我想计算每行与其他行相同的值的数量除以列数。例如,索引为 1 的行和索引为 2 的行之间有 4 个公共变量。所以,我的相似度将是 4/5(id 不算)= 80% 的相似度。我的结果必须是一个相似度矩阵,因为之后我想找到相似度高于 0.6 的行来构建一个新的数据框。可能是这样的:
print(similarity)
0 1 2 3 4
0 1 0 0 0 0.2
1 0.2 1 0.8 0.2 0
2 0 0.8 1 0.2 0
3 0 0.2 0.2 1 0
4 0.2 0 0 0 1
Run Code Online (Sandbox Code Playgroud)
因为结果是重复的,所以一半就足够了:
print(similarity)
0 1 2 3 4
0 0 0 0 0.2
1 0.8 0.2 0
2 0.2 0
3 0
4
Run Code Online (Sandbox Code Playgroud)
我正在寻找一个可以自动执行此操作的功能,但我找不到。存在这样的东西吗?感谢您的阅读,任何建议或想法都将受到欢迎。
scipy.spatial.distance.pdist您可以与自定义距离函数一起使用
from scipy.spatial.distance import pdist, squareform
pd.DataFrame(1 - squareform(pdist(df.set_index('id'), lambda u,v: (u != v).mean())))
Run Code Online (Sandbox Code Playgroud)
出去:
0 1 2 3 4
0 1.0 0.0 0.0 0.0 0.2
1 0.0 1.0 0.8 0.2 0.0
2 0.0 0.8 1.0 0.2 0.0
3 0.0 0.2 0.2 1.0 0.0
4 0.2 0.0 0.0 0.0 1.0
Run Code Online (Sandbox Code Playgroud)