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

使用pandas DataFrame乘法创建邻接矩阵结果全为NaN的解决方法

问题背景

需要从记录学校项目ID、项目类型、分配学生、学生项目角色、学生性别的Excel文件中构建邻接矩阵(adjacency matrix):

  • 目标生成12×12的矩阵M,对任意两名学生x、y,M[x][y] 的值为两人共同参与的项目总数

最初编写的代码运行后所有输出值均为NaN:

import pandas as pd

df  = pd.read_excel('test.xlsx')
df1 = pd.crosstab(df.project_id, df.student_id)
df2 = df1 * df1.T
print(df2)
错误原因

*在pandas中是逐元素乘法,运算时会严格对齐两个对象的行索引和列索引:

  • df1的行索引是项目ID,列索引是学生ID
  • df1.T是df1的转置,行索引是学生ID,列索引是项目ID
    两者行列索引完全不匹配,逐元素计算时找不到对应位置的有效值,因此全部返回NaN。
修复代码

要计算学生两两共同参与的项目数,本质是对「项目-学生」关联矩阵做矩阵点积,将逐元素乘*替换为矩阵乘法运算符@即可:

import pandas as pd

df = pd.read_excel('test.xlsx')
# 构建行=项目、列=学生的0-1矩阵,值为1代表对应学生参与了该项目
project_student_mat = pd.crosstab(df.project_id, df.student_id)
# 转置后做矩阵乘法,得到学生*学生的邻接矩阵,值为两人共参项目数
adj_matrix = project_student_mat.T @ project_student_mat
print(adj_matrix)

可选调整:如果你的分析场景不需要对角线值(对角线默认是对应学生本人参与的项目总数),可以添加下面这行代码把对角线值统一设为0:

import numpy as np
np.fill_diagonal(adj_matrix.values, 0)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:21:21