将矩阵乘积转换为 nx.Graph

Convert matrix product to nx.Graph

我有一个这样的数据框

import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({'a' : [1,1,0,0], 'b': [0,1,1,0], 'c': [0,0,1,1]})

我得到一个矩阵乘积

df.T.dot(df)

   a  b  c
a  2  1  0
b  1  2  1
c  0  1  2

我想得到 nx.Graph,然后是 nx.draw_networkx

G.add_node('a', weight = 2 ) # 2 means sum of 'a'
....................
G.add_edge('a','b',range=1) # 1 means cell's value at the intersection
................

当然我可以像上面那样手工完成,但是在真实的数据集中更多的数据。有没有更简单的方法将矩阵乘积转换为 nx.Graph?

使用循环!如果我没理解错的话,下面的方法应该有效,

import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({'a': [1, 1, 0, 0], 'b': [0, 1, 1, 0], 'c': [0, 0, 1, 1]})

product = df.T.dot(df)

graph = nx.Graph()

for column in df.columns:
    graph.add_node(column, weight=product[column][column])

for row_label, values in product.iterrows():
    for column_label, value in values.iteritems():
        if row_label != column_label:
            graph.add_edge(row_label, column_label, range=value)

nx.draw_networkx(graph)
plt.show()

哪个产量,

另一个没有循环的选项是使用 pandas 数据帧重塑和 networkx 2.0 与 pandas 集成方法:

import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd

df = pd.DataFrame({'a': [1, 1, 0, 0], 'b': [0, 1, 1, 0], 'c': [0, 0, 1, 1]})

product = df.T.dot(df)

graph = nx.Graph()

dfG = product.stack().rename('value').rename_axis(['source','target']).reset_index()

G = nx.Graph()

G = nx.from_pandas_edgelist(dfG.query('source != target'), 'source', 'target', 'value', G)

attr_dict = dfG.query('source == target').set_index('source')['value'].to_dict()
nx.set_node_attributes(G, attr_dict,'weight')

nx.draw_networkx(G)

输出: