0

I am trying to create a table displaying the attributes of nodes in a NetworkX (using Python) graph. The functions used to get these attributes generate a list of the nodes with their assigned attribute and are generated like in the following:

import networkx as nx

# degrees of nodes
pprint(g.degree())

# clustering coefficient
pprint(nx.clustering(g))

I should like to be able to compile these into a table with intuitive overview in the following format:

node    degree    clustering coefficient
----------------------------------------
a       2         3
b       1         1
...

Any tips on how to do so? Perhaps using a dict and tabulate but I am not quite sure... Would be grateful for any tips!

Edit I found a way to do some simple printing, but it isn't formatted very nicely and doesn't make for nice syntax:

for n in g.nodes():
    print(n, g.degree(n), nx.clustering(g, n))
sppokky
  • 115
  • 6

1 Answers1

2

I would use a Pandas dataframe (pd.DataFrame) to store this data, which I would construct in a list comprehension of dictionaries (each dictionary corresponding to a row in the final data frame). Here's how I would do that with two attributes, in_degree and out_degree for each node:

import pandas as pd
import networkx as nx
g = nx.DiGraph()

# ... populate the Digraph ...

def compute_indegree(node, digraph):
  return digraph.in_degree(node)

def compute_outdegree(node, digraph):
  return digraph.out_degree(node)

attr_dicts = [
  { 'node': node,
    'in_degree': compute_indegree(node, g), \
    'out_degree': compute_outdegree(node, g)} \
  for node in g.nodes
]

dataframe = pd.DataFrame(attr_dicts)
dataframe.set_index('node', inplace=True)
print(dataframe)

The final print line neatly formats the resulting DataFrame:

Printline results

If you modify or add the above functions compute_indegree and compute_outdegree to return other stats like your clustering coefficient, the table will still populate as above.

dsillman2000
  • 976
  • 1
  • 8
  • 20