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

Pandas read_csv得到小数列名无法构建二分图该如何解决

问题解决步骤

1 核心报错根因定位

你调用nx.from_pandas_adjacency报错的核心原因有两个可能:

  • 该接口仅接受方阵格式的普通图邻接矩阵,要求行列数完全相等、行索引与列名完全对应;如果你要构建二分图,手里的矩阵大概率是二部邻接矩阵(行、列分别对应两类不同节点,行列数可以不等),完全不适用该接口
  • 读取CSV时默认没有将第一列设为行索引,导致读出来的DataFrame多了一列,行列数不匹配,同时转CSV时格式丢失导致列名变为浮点数,和行索引格式不匹配

2 分步解决方法

2.1 修正CSV读取逻辑

读取时指定index_col=0将第一列设为行索引,避免额外多出普通数据列:

mat = pd.read_csv("networkdata3.csv", index_col=0)

如果需要直接读取原XLSX文件,安装openpyxl依赖后指定引擎即可,无需转CSV避免格式丢失:

# 终端执行安装依赖
pip install openpyxl

读取代码修改为:

mat = pd.read_excel("networkdata1.xlsx", sheet_name="sheet_name_1", index_col=0, engine='openpyxl')

2.2 修复列名格式问题

统一行索引和列名的格式,避免因格式差异(比如整数行索引对应浮点数列名)导致匹配失败:

# 统一转为字符串格式
mat.index = mat.index.astype(str)
mat.columns = mat.columns.astype(str)

# 如果本来都是整数节点ID,也可以统一转为整数
# mat.columns = mat.columns.map(lambda x: int(float(x)))
# mat.index = mat.index.astype(int)

2.3 二分图专属构建逻辑

如果是二部邻接矩阵(行列对应两类不同节点),不要用普通邻接矩阵接口,用以下方式构建二分图:

import networkx as nx
from networkx.algorithms import bipartite

mat = pd.read_csv("networkdata3.csv", index_col=0)
# 统一格式
mat.index = mat.index.astype(str)
mat.columns = mat.columns.astype(str)

G = nx.Graph()
# 标记左部节点(行索引)属于二分图0分区
G.add_nodes_from(mat.index.tolist(), bipartite=0)
# 标记右部节点(列名)属于二分图1分区
G.add_nodes_from(mat.columns.tolist(), bipartite=1)

# 批量加边,仅加权重>0的边,可按需调整判断条件
edges = []
for u in mat.index:
    for v in mat.columns:
        w = mat.loc[u, v]
        if w > 0:
            edges.append((u, v, {"weight": w}))
G.add_edges_from(edges)

2.4 验证逻辑

构建前先校验矩阵参数是否符合预期:

# 打印行列数
print(f"矩阵行数:{mat.shape[0]},矩阵列数:{mat.shape[1]}")
# 如果是普通邻接矩阵需要校验行索引与列名是否匹配
print(f"行索引与列名是否完全一致:{mat.index.equals(mat.columns)}")

内容的提问来源于stack exchange,提问作者Kevin Scott

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:18:03