在Python 3中从CSV文件创建Networkx图

Mel*_*ssa 4 social networking decode networkx python-3.x

我正在尝试从CSV文件构建NetworkX社交网络图。我正在使用Networkx 2.1和Python 3

我没有运气就遵循了这篇文章,因为我不断收到错误:AttributeError:'list'对象没有属性'decode'。

我的目标是使权重显示的边缘较粗,而权重较高。

到目前为止,这是我的代码:

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()
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法来解决这个问题?数据相对简单。

谢谢您的帮助!

duc*_*inh 5

您正在滥用该功能read_edgelist。从文档中,每行需要解析一个字符串,而csv.reader将输入文件中的行解析为字符串列表(例如202,237,1 -> ['202', '237', '1'])。因此,AttributeError之所以引发是因为read_edgelist正在尝试解析所提供的列表csv.reader,而它们应该是字符串。

我们可以在不使用csv模块的情况下从输入文件中正确解析图形。但是,我们仍然需要处理输入文件的第一行(标题),不应对其进行解析。有两种方法。第一种方法使用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),))
Run Code Online (Sandbox Code Playgroud)

第二种方法有点“ hacky”:由于第一行以开头target,我们t在输入文件中将字符标记为注释的开始。

Data = open('test.csv', "r")
Graphtype = nx.Graph()

G = nx.parse_edgelist(Data, comments='t', delimiter=',', create_using=Graphtype,
                      nodetype=int, data=(('weight', float),))
Run Code Online (Sandbox Code Playgroud)

在这两种方法中,我们都必须使用parse_edgelist代替,read_edgelist因为输入文件使用\r换行符。要使用read_edgelist该文件,需要以二进制模式打开文件,如果换行符为\r\n或,则将\n其行分开。因此,带有\r换行符的输入文件无法拆分为几行,因此无法正确解析。

另外,由于要查找进度和出度,因此应使用DiGraph而不是来创建图形Graph

编辑

这里的关键点是跳过输入文件中的标题。为此,我们可以先将输入文件读取为pandas.DataFrame,然后将其转换为图形。

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)
Run Code Online (Sandbox Code Playgroud)