调用pyvis的from_nx加载networkx图时触发AssertionError报错
pyvis调用
net.from_nx(G)抛出AssertionError的原因及修复方案 核心报错原因
这个断言错误是from_nx()方法内部的合法性校验未通过导致的,常见触发场景有三类:
- 依赖版本不兼容:这是最高发的原因。NetworkX 3.0及以上版本调整了图对象内部节点、边的属性存储结构,0.3.1及更早版本的PyVis没有做适配,方法内部断言节点/边属性格式符合旧版规范时就会失败。
- 源数据存在非法节点:用
from_pandas_edgelist生成图时,如果desc.x、desc.y列存在空值(NaN/None),或者节点值是列表、字典这类不可哈希的可变类型,遍历节点做校验时会触发断言。 - 边属性存在非法值:指定
lift作为边属性时,如果该列存在空值、自定义对象、嵌套结构这类无法被JSON序列化的值,边属性校验环节会抛出断言错误。
排查修复步骤
- 先清洗源数据,过滤非法值
执行以下代码检查数据问题,提前过滤脏数据:
# 统计关键字段空值数量 print(rules[["desc.x", "desc.y", "lift"]].isna().sum()) # 校验节点值类型合法性 print(rules["desc.x"].map(type).value_counts()) print(rules["desc.y"].map(type).value_counts()) # 校验lift列是否为合法数值 print(pd.to_numeric(rules["lift"], errors="coerce").isna().sum()) # 过滤掉存在空值的行 rules = rules.dropna(subset=["desc.x", "desc.y", "lift"])
- 修复依赖版本兼容问题
如果数据校验没有问题,优先选择升级PyVis到适配NetworkX 3.x的最新版本;如果升级后仍有兼容问题,可以将NetworkX降级到2.6.3的稳定兼容版本,对应执行命令:
# 升级PyVis pip install --upgrade pyvis # 备选:降级NetworkX到兼容版本 pip install networkx==2.6.3
- 手动补全节点/边属性绕过校验
如果不想调整依赖版本,可以在传入PyVis前手动给所有节点、边补全PyVis要求的默认属性,直接绕过断言校验:
G = nx.from_pandas_edgelist(rules, source = "desc.x", target = "desc.y", edge_attr = "lift") # 补全节点必填属性 for n in G.nodes: G.nodes[n]["title"] = str(n) G.nodes[n]["size"] = 10 # 补全边必填属性 for e in G.edges: edge_lift = G.edges[e]["lift"] G.edges[e]["title"] = f"关联强度lift: {edge_lift}" net = Network(notebook = True, width=1000, height=600) net.from_nx(G)
内容的提问来源于stack exchange,提问作者Ricardo Muñoz romero
相关产品推荐
相关产品推荐

