【问题标题】:Calculate similarity between rows of a dataframe (count values in common)计算数据帧行之间的相似度(共同计数值)
【发布时间】:2020-11-02 21:55:16
【问题描述】:

我想计算数据框各行之间的相似度。我有一些关于某些人的信息的专栏。一排是一个人。看起来是这样的:

 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 

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

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    您可以将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
    

    【讨论】:

      猜你喜欢
      • 2018-10-02
      • 2021-11-18
      • 2011-02-04
      • 2017-12-08
      • 2021-05-24
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多