在R中为选修课推荐系统生成按Term_Code排序的序列数据的技术求助
解决方案:从交叉表生成按学期排序的课程-成绩序列
嘿,我来帮你搞定这个序列数据生成的问题!要把无学期顺序的交叉表(Table2)转换成按Term_Code排序的Course_Num:Grade序列(也就是你要的Table3),用Python的pandas就能轻松实现,下面是具体的步骤和代码示例:
步骤1:数据结构假设
首先假设你的Table2是宽表结构——每一行对应一个学生的某学期选课记录,列是课程名称,值是对应成绩,同时包含Student_ID(学生ID)和Term_Code(学期代码)字段。示例结构如下:
| Student_ID | Term_Code | Math101 | English101 | CS101 | History101 |
|---|---|---|---|---|---|
| 1001 | 202301 | A | B | NaN | NaN |
| 1001 | 202302 | NaN | NaN | A- | B+ |
| 1002 | 202301 | B+ | A | B | NaN |
步骤2:将宽表转成长表
首先把宽表中分散的课程列转换成行,保留学生ID和学期代码,同时过滤掉没有成绩的空值:
import pandas as pd # 读取你的Table2数据(这里假设已经加载到table2变量中) # table2 = pd.read_csv("your_table2_data.csv") # 宽表转长表,提取课程和成绩 long_df = pd.melt( table2, id_vars=['Student_ID', 'Term_Code'], # 保留的非课程字段 var_name='Course_Num', # 转换后的课程名列名 value_name='Grade' # 转换后的成绩列名 ) # 过滤掉没有成绩的记录(NaN值) long_df = long_df.dropna(subset=['Grade'])
步骤3:按学生和学期排序
确保每个学生的课程记录是按Term_Code的时间顺序排列的:
# 按学生ID分组,再按学期代码排序 long_df = long_df.sort_values(by=['Student_ID', 'Term_Code'])
如果你的Term_Code是字符串格式(比如"Fall2023"),只要它的命名是按时间逻辑来的(比如年份+学期缩写),排序就会正常生效;如果不是,你可能需要先把Term_Code转换成可排序的格式(比如将"Fall2023"映射为202301,"Spring2024"映射为202402)。
步骤4:生成课程-成绩序列
最后,把每个学生的Course_Num:Grade组合按学期顺序拼接成序列,得到目标的Table3:
# 分组拼接序列 table3 = long_df.groupby('Student_ID').agg( Course_Sequence=lambda x: ', '.join(f"{row['Course_Num']}:{row['Grade']}" for _, row in x.iterrows()) ).reset_index()
生成的Table3结构会是这样:
| Student_ID | Course_Sequence |
|---|---|
| 1001 | Math101:A, English101:B, CS101:A-, History101:B+ |
| 1002 | Math101:B+, English101:A, CS101:B |
如果你的Table2结构和示例有差异(比如Term_Code是和课程绑定的其他形式),可以根据实际情况调整id_vars或者排序逻辑,核心思路就是先转成包含学期的长表,再排序拼接。
内容的提问来源于stack exchange,提问作者Jayanth N Bharadwaj
相关产品推荐
相关产品推荐

