计算数据框行之间的相似度(计算共同值)。

3
我希望您能够翻译数据框行之间的相似度计算,该数据框包含与某些人有关的一些列信息。其中每一行对应一个人的信息,类似于以下格式:
 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

我想要对于每一行,计算与其他行共有的值的数量除以列数。如果至少有 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

由于结果是重复的,其中一半就足够了:
 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 

我正在寻找一种可以自动化完成这项任务的函数,但是我找不到。类似这样的东西存在吗? 感谢阅读,欢迎任何建议或想法。

1个回答

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())))

输出:

     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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接