我有一个表示加权二分网络的数据框,如下所示:
L1,L2,w
1,A,0.9
2,A,0.2
3,A,0.5
1,B,0.9
2,B,0.8
其中L1列中的节点连接到L2列中的节点,其权重值与每个边(w)相关联。
我想将网络投射到L1级别。第一步是连接L1值,如果它们连接到相同的L2值,乘以权重,例如:
1,2,0.9*0.2
2,3,0.2*0.5
1,3,0.9*0.5
1,2,0.9*0.8
第二步是构建一个新的数据框(加权边列表),总结重复边的权重:
1,2,0.9*0.2 + 0.9*0.8
2,3,0.2*0.5
1,3,0.9*0.5
我知道这有点奇怪;我使用networkx bipartite函数尝试了相同的方法,但是在它内部的权重上工作有点棘手,所以我更喜欢使用pandas数据帧。
答案 0 :(得分:0)
df2 = df.merge(df,on='L2')
df3 = df2[ df2.L1_x > df2.L1_y ] # drop duplicates and matches to self
df3['w'] = df3.w_x * df3.w_y # multiply weights
df4 = df3.groupby(['L1_y','L1_x'])['w'].sum()
L1_y L1_x
1 2 0.90
3 0.45
2 3 0.10