问题描述
我有一个Pandas数据框,其中包含三列id
(唯一标识符),然后是三个字符串列event_one
,event_two
和event_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对,它将测试每个事件列之间的字符串相等性,然后计算出事件总数中匹配的事件分数
例如,如果我们将N1
与N5
进行比较,则该对的邻接矩阵中的关联条目将为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