使用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,列索引是学生IDdf1.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
相关产品推荐
相关产品推荐

