I am trying to build a NetworkX social network graph from a CSV file. I am using Networkx 2.1 and Python 3
I followed this post with no luck because I keep receiving the error:
AttributeError: 'list' object has no attribute 'decode'
My goal is to make the weights display thicker edges for the higher weights.
Here is my code so far:
import networkx as nx
import csv
Data = open('testest.csv', "r", encoding='utf8')
read = csv.reader(Data)
Graphtype=nx.Graph() # use net.Graph() for undirected graph
G = nx.read_edgelist(read, create_using=Graphtype, nodetype=int, data=(('weight',float),))
for x in G.nodes():
print ("Node:", x, "has total #degree:",G.degree(x), " , In_degree: ", G.out_degree(x)," and out_degree: ", G.in_degree(x))
for u,v in G.edges():
print ("Weight of Edge ("+str(u)+","+str(v)+")", G.get_edge_data(u,v))
nx.draw(G)
plt.show()
Is there a more simplified way to approach this? The data is relatively simple.
Thank you for your help!
Go to the ribbon and click Insert. Choose the type of graph that you want to insert. On selecting a graph, a blank window will appear. On right clicking, a drop-down menu appears, from which you can choose the Select Data option.
nbunch. An nbunch is a single node, container of nodes or None (representing all nodes). It can be a list, set, graph, etc.. To filter an nbunch so that only nodes actually in G appear, use G.
You are misusing the function read_edgelist
. From the documentation, each line needs to be parsed a string, while csv.reader
parses the lines in the input file into lists of strings (for example, 202,237,1 -> ['202', '237', '1']
). Therefore, AttributeError
is raised because read_edgelist
is trying to parse the lists provided by csv.reader
, while they should be strings.
We can correctly parse the graph from the input file without using the csv
module. However, we still need to deal with the first line (the headers) of the input file, which should not be parsed. There are two methods. The first method skip the first line using next
:
Data = open('test.csv', "r")
next(Data, None) # skip the first line in the input file
Graphtype = nx.Graph()
G = nx.parse_edgelist(Data, delimiter=',', create_using=Graphtype,
nodetype=int, data=(('weight', float),))
The second method is a bit "hacky": since the first line starts with target
, we mark the character t
as the start of a comment in the input file.
Data = open('test.csv', "r")
Graphtype = nx.Graph()
G = nx.parse_edgelist(Data, comments='t', delimiter=',', create_using=Graphtype,
nodetype=int, data=(('weight', float),))
In both methods, we have to use parse_edgelist
instead of read_edgelist
because the input file uses \r
for newlines. To use read_edgelist
, the file needs to be opened in binary mode, whose lines are split iff the newlines are either \r\n
or \n
. Thus the input file with \r
newlines cannot be split into lines, and thus cannot parsed correctly.
Also, since you want to find the in-degrees and out-degrees, the graph should be created using DiGraph
, not Graph
.
The key point here is to skip the header in the input file. We can achieve this by first reading the input file into a pandas.DataFrame
, then we convert it to a graph.
import networkx as nx
import pandas as pd
df = pd.read_csv('test.csv')
Graphtype = nx.Graph()
G = nx.from_pandas_edgelist(df, edge_attr='weight', create_using=Graphtype)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With