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

基于两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 18:31:43