本文介绍了从CSV文件创建Networkx图表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试从CSV file构建一个NetworkX社交网络图。我使用的是Networkx 2.1和Python3
我关注了this post,但没有成功,因为我一直收到错误:
AttributeError: 'list' object has no attribute '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()
有没有更简单的方法来解决这个问题?数据比较简单。
感谢您的帮助!
推荐答案
您误用了函数read_edgelist
。从documentation开始,每一行都需要解析一个字符串,而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),))
第二种方法有点"老生常谈":因为第一行以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),))
在这两种方法中,我们必须使用parse_edgelist
而不是read_edgelist
,因为输入文件使用
作为换行符。要使用read_edgelist
,需要以二进制模式打开文件,当换行时,换行数为
或
。因此,
换行符的输入文件无法拆分为行,因此无法正确分析。此外,由于您要查找入度和出度,因此应使用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)
这篇关于从CSV文件创建Networkx图表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!