为了账号安全,请及时绑定邮箱和手机立即绑定

将边列表转换为邻接矩阵

将边列表转换为邻接矩阵

拉风的咖菲猫 2021-08-14 17:16:26
我的数据框表示图的边列表,格式如下:  node1 node2 weight0     a     c      11     b     c      22     d     c      3我的目标是生成等效的邻接矩阵:    a b c da   0 0 1 0b   0 0 2 0c   0 0 0 3d   0 0 0 0目前,在构建边的数据帧时,我计算节点的数量并创建一个 NxN 数据帧并手动填充值。从第一个数据帧生成第二个数据帧的熊猫方式是什么?
查看完整描述

2 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

决定对这个问题找点乐子。


您可以将node1和转换node2为 Categorical dtype,然后使用groupby.


from functools import partial


vals = np.unique(df[['node1', 'node2']])

p = partial(pd.Categorical, categories=vals) 

df['node1'], df['node2'] = p(df['node1']), p(df['node2'])


(df.groupby(['node1', 'node2'])

   .first()

   .fillna(0, downcast='infer')

   .weight

   .unstack())


node2  a  b  c  d

node1            

a      0  0  1  0

b      0  0  2  0

c      0  0  0  0

d      0  0  3  0

另一种选择是直接设置底层数组值。


df2 = pd.DataFrame(0, index=vals, columns=vals)

f = df2.index.get_indexer

df2.values[f(df.node1), f(df.node2)] = df.weight.values


print(df2)

   a  b  c  d

a  0  0  1  0

b  0  0  2  0

c  0  0  0  0

d  0  0  3  0


查看完整回答
反对 回复 2021-08-14
?
阿晨1998

TA贡献2037条经验 获得超6个赞

使用pivot与reindex


In [20]: vals = np.unique(df[['node1', 'node2']])


In [21]: df.pivot(index='node1', columns='node2', values='weight'

                  ).reindex(columns=vals, index=vals, fill_value=0)

Out[21]:

node2  a  b  c  d

node1

a      0  0  1  0

b      0  0  2  0

c      0  0  0  0

d      0  0  3  0

或者使用set_index和unstack


In [27]: (df.set_index(['node1', 'node2'])['weight'].unstack()

            .reindex(columns=vals, index=vals, fill_value=0))

Out[27]:

node2  a  b  c  d

node1

a      0  0  1  0

b      0  0  2  0

c      0  0  0  0

d      0  0  3  0


查看完整回答
反对 回复 2021-08-14
  • 2 回答
  • 0 关注
  • 303 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信