猿问

将边列表转换为邻接矩阵

我的数据框表示图的边列表,格式如下:


  node1 node2 weight

0     a     c      1

1     b     c      2

2     d     c      3

我的目标是生成等效的邻接矩阵:


    a b c d

a   0 0 1 0

b   0 0 2 0

c   0 0 0 3

d   0 0 0 0

目前,在构建边的数据帧时,我计算节点的数量并创建一个 NxN 数据帧并手动填充值。从第一个数据帧生成第二个数据帧的熊猫方式是什么?


拉风的咖菲猫
浏览 304回答 2
2回答

牧羊人nacy

决定对这个问题找点乐子。您可以将node1和转换node2为 Categorical dtype,然后使用groupby.from functools import partialvals = 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  dnode1            a      0  0  1  0b      0  0  2  0c      0  0  0  0d      0  0  3  0另一种选择是直接设置底层数组值。df2 = pd.DataFrame(0, index=vals, columns=vals)f = df2.index.get_indexerdf2.values[f(df.node1), f(df.node2)] = df.weight.valuesprint(df2)   a  b  c  da  0  0  1  0b  0  0  2  0c  0  0  0  0d  0  0  3  0

阿晨1998

使用pivot与reindexIn [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  dnode1a      0  0  1  0b      0  0  2  0c      0  0  0  0d      0  0  3  0或者使用set_index和unstackIn [27]: (df.set_index(['node1', 'node2'])['weight'].unstack()            .reindex(columns=vals, index=vals, fill_value=0))Out[27]:node2  a  b  c  dnode1a      0  0  1  0b      0  0  2  0c      0  0  0  0d      0  0  3  0
随时随地看视频慕课网APP

相关分类

Python
我要回答