代码之家  ›  专栏  ›  技术社区  ›  Edward

将矩阵乘积转换为nx.Graph

  •  0
  • Edward  · 技术社区  · 6 年前

    我有一个这样的数据框

    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
    ................
    

    ?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Nelewout    6 年前

    使用循环!如果我对你的理解正确的话,以下几点应该有用,

    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()
    

    这就产生了,

    Example graph

        2
  •  1
  •   Scott Boston    6 年前

    另一个不带循环的选项是使用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)
    

    enter image description here