从 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'
)
我想从 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'
)