基于两个DataFrame构建NetworkX学生关系图遇参数错误求助
构建学生关联NetworkX图的正确实现
你之前的代码问题在于:直接用add_edge(student, course)是把学生和课程节点连边,但需求是学生之间建立关联,而且没有遍历课程数据来生成同一课程内的学生对。下面是完整的实现步骤:
1. 准备所有顶点(学生)
先把df_student和df_course里的所有学生提取出来,建议用学号作为节点唯一标识(避免重名问题):
# 提取项目学生学号 student_ids = df_student['学号'].tolist() # 提取课程最优学生学号(假设列名为"最优学生学号") # 如果该列是逗号分隔的字符串,先拆分再展开: df_course['最优学生学号'] = df_course['最优学生学号'].str.split(',') course_top_students = df_course['最优学生学号'].explode().tolist() # 合并去重得到所有学生节点 all_student_nodes = list(set(student_ids + course_top_students))
2. 初始化图并添加节点
import networkx as nx G = nx.Graph() # 一次性添加所有学生节点 G.add_nodes_from(all_student_nodes)
3. 为同一课程的最优学生添加连边
遍历每门课程的最优学生名单,给名单里的每一对学生添加无权重边:
for _, row in df_course.iterrows(): top_students = row['最优学生学号'] # 生成该课程内所有学生的两两组合 for i in range(len(top_students)): for j in range(i+1, len(top_students)): G.add_edge(top_students[i], top_students[j])
可选:给节点添加姓名属性
如果需要在图中显示学生姓名,可以给节点添加属性:
# 建立学号到姓名的映射字典 name_mapping = df_student.set_index('学号')['姓名'].to_dict() # 批量设置节点的"姓名"属性 nx.set_node_attributes(G, name_mapping, '姓名')
内容的提问来源于stack exchange,提问作者user20821492
相关产品推荐
相关产品推荐

