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

如何在Python中将Excel中的带权边列表转换为邻接矩阵?

实现从Excel带权边列表到邻接矩阵的Python方法

没问题,我来帮你搞定这个需求!下面是一步步可落地的实现方案,代码直接就能跑~

1. 先装必要的依赖库

因为要读取Excel文件,我们需要用到pandas(处理表格数据)和openpyxl(支持xlsx格式读取),打开终端跑这行命令就行:

pip install pandas openpyxl

2. 完整实现代码

我写了一个封装好的函数,你直接传Excel文件路径就能生成邻接矩阵,还附带了注释方便你理解:

import pandas as pd
import numpy as np

def edge_list_to_adjacency_matrix(excel_path, is_undirected=False):
    """
    从Excel带权边列表生成邻接矩阵
    :param excel_path: Excel文件路径
    :param is_undirected: 是否为无向图,默认False(有向图)
    :return: 邻接矩阵(DataFrame格式,方便查看)、原始矩阵(numpy数组)
    """
    # 读取Excel文件,没有表头所以指定header=None
    df = pd.read_excel(excel_path, header=None, names=['node1', 'node2', 'weight'])
    
    # 获取所有唯一节点,排序让矩阵更整齐
    all_nodes = sorted(list(set(df['node1'].tolist() + df['node2'].tolist())))
    node_count = len(all_nodes)
    
    # 建立节点到索引的映射(解决字符串不能当矩阵下标的问题)
    node_to_idx = {node: idx for idx, node in enumerate(all_nodes)}
    
    # 初始化全0的邻接矩阵
    adj_matrix = np.zeros((node_count, node_count), dtype=int)
    
    # 遍历每一条边,填充权重
    for _, row in df.iterrows():
        u_idx = node_to_idx[row['node1']]
        v_idx = node_to_idx[row['node2']]
        adj_matrix[u_idx][v_idx] = row['weight']
        
        # 如果是无向图,需要给反向边也赋值权重
        if is_undirected:
            adj_matrix[v_idx][u_idx] = row['weight']
    
    # 转成DataFrame格式,用节点名当行/列名,方便直观查看
    adj_df = pd.DataFrame(adj_matrix, index=all_nodes, columns=all_nodes)
    
    return adj_df, adj_matrix

3. 示例用法

假设你的Excel文件(比如叫edges.xlsx)内容是这样的:

第一列第二列第三列
AppleBanana65
OrangeApple32

调用函数的代码如下:

# 生成邻接矩阵(这里假设是有向图,如果是无向图就把is_undirected设为True)
adj_df, adj_matrix = edge_list_to_adjacency_matrix("edges.xlsx")

# 打印直观的DataFrame格式
print("邻接矩阵(带节点名):")
print(adj_df)

# 打印numpy数组格式(如果需要做数值计算用这个)
print("\n原始矩阵:")
print(adj_matrix)

运行后输出的结果会是:

邻接矩阵(带节点名):
        Apple  Banana  Orange
Apple       0      65       0
Banana      0       0       0
Orange     32       0       0

原始矩阵:
[[ 0 65  0]
 [ 0  0  0]
 [32  0  0]]

几个关键细节说明

  • 字符串节点处理:通过node_to_idx把字符串节点映射成数字索引,完美解决了字符串不能直接作为矩阵下标的问题
  • 有向/无向图切换:如果你的图是无向图(比如Apple到Banana的边和Banana到Apple的边权重一样),只需要调用函数时传入is_undirected=True就行
  • 空边处理:默认没有边的位置填充0,如果需要用NaN表示无连接,可以把初始化矩阵的np.zeros改成np.full((node_count, node_count), np.nan),同时把dtype=int去掉

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:15:17