从 Pandas 邻接矩阵到 NetworkX 附属网络

from Pandas adjacency matrix to NetworkX affiliation network

我想从 Pandas 邻接矩阵创建一个 NetworkX 图。

通常这适用于 nx.from_pandas_adjacency(df)。但是这次我有一个附属网络。

这里有一个例子:

import pandas as pd
import numpy as np
import networkx as nx

#create dummy df
rng = np.random.RandomState(seed=5)
rng = np.random.RandomState(seed=5)
ints = rng.randint(1, 11, size=(4, 2))
df = pd.DataFrame(ints, columns=["Book1","Book2"])
df["Tag"]=['music','city','transport','traveling']
df.set_index('Tag', inplace=True)

#show dummy df
print (df)

这给出了虚拟 df:

           Book1  Book2
Tag                    
music          4      7
city           7      1
transport     10      9
traveling      5      8

如果我现在尝试使用 nx.from_pandas_adjacency(df),则会出现以下错误消息:

networkx.exception.NetworkXError: ('Columns must match Indices.', 
"['music', 'city', 'transport', 'traveling'] not in columns")

我可以做一个循环并将信息放入边缘列表,然后像这样将它传递给 Networkx:

edgelist=[
('Book1','music',4),
('Book2','music',7),
('Book1','city',7),
('Book2','city',1)... and so on]

但我确信有更好、更有效的方法来做到这一点。真正的 df 有 1000+ 本书和 90% NaN 值(无优势)。

你可以融化dataframe然后使用nx.from_pandas_edgelist:

G = nx.from_pandas_edgelist(
    df.reset_index().melt(id_vars='Tag'),
    source='Tag',
    target='variable',
    edge_attr='value'
)