通过使用字符串列的子集比较所有行来创建邻接矩阵

问题描述

我有一个Pandas数据框,其中包含三列id(唯一标识符),然后是三个字符串列event_oneevent_twoevent_three,如下所示:>

test_df.head()

    id  event_one  event_two  event_three
0   N1  'aaa'      'abc'      'xyz'
1   N2  'bbb'      'abc'      'uvw'
2   N3  'ccc'      'def'      'xyz'
3   N4  'aaa'      'def'      'uvw'
4   N5  'aaa'      'abc'      'zzz'

我想创建一个邻接矩阵(作为数据框),对于所有ID对,它将测试每个事件列之间的字符串相等性,然后计算出事件总数中匹配的事件分数

例如,如果我们将N1N5进行比较,则该对的邻接矩阵中的关联条目将为2/3(或0.66 ..),因为它们在{{1 }}和event_one,但没有event_two

使用上面的event_three示例,最终的邻接矩阵(表示为Pandas数据帧)如下所示:

test_df

到目前为止,我编写的代码(请参见下文)使用 N1 N2 N3 N4 N5 ---------------------------- N1| - 1/3 1/3 1/3 2/3 N2| 1/3 - 0 1/3 1/3 N3| 1/3 0 - 1/3 0 N4| 1/3 1/3 1/3 - 1/3 N5| 2/3 1/3 0 1/3 - 一个lambda表达式,但仅基于pdist。如何将其扩展到所有三个事件列,然后计算最终计算量,还是有更好的方法呢?

event_one

任何建议都会很棒,谢谢。

解决方法

让我们使用filter选择类似event的列,然后使用pdist并传递一个自定义的lambda函数f,该函数比较成对的行并返回符合条件的事件:

from scipy.spatial.distance import pdist,squareform

f = lambda u,v: (u == v).sum() / len(u)
a = squareform(pdist(df.filter(like='event'),f))
d = pd.DataFrame(a,index=df['id'].tolist(),columns=df['id'].tolist())

print(d)
         N1        N2        N3        N4        N5
N1  0.000000  0.333333  0.333333  0.333333  0.666667
N2  0.333333  0.000000  0.000000  0.333333  0.333333
N3  0.333333  0.000000  0.000000  0.333333  0.000000
N4  0.333333  0.333333  0.333333  0.000000  0.333333
N5  0.666667  0.333333  0.000000  0.333333  0.000000