【问题标题】:Create Networkx Graph from CSV file从 CSV 文件创建 Networkx Graph
【发布时间】:2018-09-15 22:19:37
【问题描述】:

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

我没有运气关注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()

有没有更简化的方法来解决这个问题?数据比较简单。

感谢您的帮助!

【问题讨论】:

  • 如果没有MCVE,我们将无法重现错误。您能否上传csv 文件或其中的一部分?
  • 感谢您的提示,已添加到 Github。 @ducminh 我是 Stack Overflow 的新手。

标签: python-3.x networking decode networkx social


【解决方案1】:

您误用了函数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),))

第二种方法有点“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),))

在这两种方法中,我们都必须使用parse_edgelist 而不是read_edgelist,因为输入文件使用\r 作为换行符。要使用read_edgelist,文件需要以二进制模式打开,其行被拆分iff the newlines are either \r\n or \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)

【讨论】:

  • 感谢您的帮助@ducminh!!!如果我选择仅从数据中绘制某些节点而不是所有节点,它将如何改变?我之所以问是因为解析边缘列表的第二种方法的规范(这是我发现效果最好的方法!)。 (例如:如果您只想查看节点 6、240 和 282,以及它们所连接的节点)。
  • @Melissa 我可以想到两种方法:要么过滤 DataFrame 的行,然后从过滤后的数据创建图形,要么您可以先创建完整图形,然后获取子图。第一种方法会更有效。
猜你喜欢
  • 2016-01-30
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
相关资源
最近更新 更多