You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NetworkX加载CSV构建图时遇类型错误与解包错误求助

问题:CSV批量处理节点/边数据导入NetworkX失败

操作流程

  • 使用sknetwork.data.from_csv读取nodes.csv和edges.csv,得到稀疏矩阵格式的nodes和edges
  • 转换为列表_nodes = [n for n in nodes]、_edges = [n for n in edges]
  • 创建NetworkX的Graph实例,调用add_nodes_from(_nodes)和add_edges_from(_edges)添加节点与边

异常情况

  • 调用add_nodes_from(_nodes)时,先触发TypeError: unhashable type: 'csr_matrix',随后抛出ValueError: not enough values to unpack (expected 2, got 1)
  • 调用add_edges_from(_edges)时,抛出"Unexpected exception formatting exception. Falling back to standard exception"

相关代码

import pandas as pd
import numpy as np
from scipy import sparse
import pandas as pd
import networkx as nx
from sknetwork.data import from_edge_list, from_adjacency_list, from_graphml, from_csv
from sknetwork.visualization import svg_graph, svg_bigraph
from sknetwork.utils import bipartite2undirected

edges = from_csv("edges.csv")
nodes = from_csv("nodes.csv")

_nodes = [n for n in nodes]
_edges = [n for n in edges]

G = nx.Graph() 
G.add_nodes_from(_nodes) # 触发错误
G.add_edges_from(_edges) # 触发错误
print(nx.info(G))

错误回溯(add_nodes_from时)

TypeError                                 Traceback (most recent call last)
File ~/opt/anaconda3/lib/python3.9/site-packages/networkx/classes/graph.py:562, in Graph.add_nodes_from(self, nodes_for_adding, **attr)
    561 try:
--> 562     if n not in self._node:
    563         self._adj[n] = self.adjlist_inner_dict_factory()

TypeError: unhashable type: 'csr_matrix'

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
Cell In[99], line 10
      7 _labels = [n for n in edges][1:]
      9 G = nx.Graph() 
--> 10 G.add_nodes_from(_nodes) 
     11 G.add_edges_from(_edges) 
     12 print(nx.info(G))

File ~/opt/anaconda3/lib/python3.9/site-packages/networkx/classes/graph.py:569, in Graph.add_nodes_from(self, nodes_for_adding, **attr)
    567         self._node[n].update(attr)
    568 except TypeError:
--> 569     nn, ndict = n
    570     if nn not in self._node:
    571         self._adj[nn] = self.adjlist_inner_dict_factory()

ValueError: not enough values to unpack (expected 2, got 1)

数据样本

  • _nodes元素为csr_matrix类型:
[<1x5795 sparse matrix of type '<class 'numpy.int64'>' with 385 stored elements in Compressed Sparse Row format>, ...]
  • _edges元素为csr_matrix类型:
[<1x5794 sparse matrix of type '<class 'numpy.int64'>' with 248 stored elements in Compressed Sparse Row format>, ...]
  • 节点数据样本:
(0, 1265)   1
  (0, 1338) 1
  ...
  (5792, 3) 2
  (5792, 5) 1
  (5792, 29)    1
  • 边数据样本:
(0, 682)    1
  (0, 683)  1
  ...
  (5793, 5766)  1
  (5793, 5767)  1
  (5793, 5768)  1
  (5793, 5769)  1
解决方案

问题根源

sknetwork.data.from_csv返回的是稀疏矩阵对象,直接遍历得到的是矩阵的行(仍为csr_matrix类型),而NetworkX的add_nodes_from和add_edges_from需要可哈希的节点标识(如整数、字符串)和边的二元组(如(u, v)),csr_matrix无法满足要求。

修正步骤

1. 手动解析CSV数据

直接用Pandas读取CSV,提取NetworkX需要的格式:

import pandas as pd
import networkx as nx

# 读取节点CSV,提取节点ID(假设第一列为节点ID)
nodes_df = pd.read_csv("nodes.csv")
node_ids = nodes_df.iloc[:, 0].tolist()

# 读取边CSV,提取边的(u, v)二元组(假设前两列为起点、终点)
edges_df = pd.read_csv("edges.csv")
edge_list = edges_df.iloc[:, :2].values.tolist()

# 构建图
G = nx.Graph()
G.add_nodes_from(node_ids)
G.add_edges_from(edge_list)
print(nx.info(G))

2. 保留节点/边属性(可选)

如果需要保留属性,可补充以下代码:

# 添加节点属性
for idx, row in nodes_df.iterrows():
    node_id = row.iloc[0]
    attrs = row.iloc[1:].to_dict()
    G.nodes[node_id].update(attrs)

# 添加边属性
for idx, row in edges_df.iterrows():
    u, v = row.iloc[:2]
    attrs = row.iloc[2:].to_dict()
    G.edges[u, v].update(attrs)

3. 利用sknetwork直接转NetworkX图

sknetwork提供内置转换方法,无需手动解析邻接关系:

from sknetwork.data import from_csv
from sknetwork.utils import to_networkx
import pandas as pd
import networkx as nx

# 读取边数据生成邻接矩阵,直接转为NetworkX图
adjacency = from_csv("edges.csv")
G = to_networkx(adjacency)

# 读取节点数据并添加属性
nodes_df = pd.read_csv("nodes.csv")
for idx, row in nodes_df.iterrows():
    node_id = row.iloc[0]
    attrs = row.iloc[1:].to_dict()
    G.nodes[node_id].update(attrs)

print(nx.info(G))

内容的提问来源于stack exchange,提问作者Data Science Analytics Manager

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 05:55:04