计算数据帧行之间的相似度(计算公共值)

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)

我正在寻找一个可以自动执行此操作的功能,但我找不到。存在这样的东西吗?感谢您的阅读,任何建议或想法都将受到欢迎。

Mic*_*sny 6

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)