如何用Pandas生成含全部学生及学期的课程数统计表格?
解决Pandas生成学生全学期课程统计表格的问题
步骤1:统计已有学生的各学期课程数量
先对原始数据按student和course(对应学期)分组,统计每组的课程总数:
import pandas as pd # 原始数据 df1 = pd.DataFrame({'student': ['A01','A01','A01','A02','A02','A04','A04','A04'], 'course': ['0', '3', '4', '2', '2', '0', '2', '4']}) # 转换course为整数类型,方便后续匹配 df1['course'] = df1['course'].astype(int) # 统计每个学生每学期的课程数 course_counts = df1.groupby(['student', 'course']).size().reset_index(name='course_count')
步骤2:生成完整的学生编号列表
从原始数据中提取学生编号的数字部分,生成连续的完整学生编号:
# 提取学生编号的数字并转为整数 student_nums = [int(s[1:]) for s in df1['student'].unique()] min_num = min(student_nums) max_num = max(student_nums) # 生成格式为A+两位数字的连续学生编号 all_students = [f'A{num:02d}' for num in range(min_num, max_num+1)]
步骤3:生成所有学生与全学期的笛卡尔积
构建包含所有学生和0-4学期的完整表格框架:
# 定义所有学期 all_semesters = [0,1,2,3,4] # 生成学生与学期的笛卡尔积 full_index = pd.MultiIndex.from_product([all_students, all_semesters], names=['student', 'semester']) full_df = pd.DataFrame(index=full_index).reset_index()
步骤4:合并数据并填充缺失值
将统计的课程数与完整框架合并,缺失的课程数填充为0:
# 匹配学生和学期,合并数据 result = pd.merge(full_df, course_counts, left_on=['student', 'semester'], right_on=['student', 'course'], how='left') # 填充缺失值为0,清理多余列并调整列顺序 result['course_count'] = result['course_count'].fillna(0).astype(int) result = result.drop('course', axis=1)[['student', 'semester', 'course_count']]
最终结果
运行上述代码后,result即为目标DataFrame:
print(result)
输出:
student semester course_count 0 A01 0 1 1 A01 1 0 2 A01 2 0 3 A01 3 1 4 A01 4 1 5 A02 0 0 6 A02 1 0 7 A02 2 2 8 A02 3 0 9 A02 4 0 10 A03 0 0 11 A03 1 0 12 A03 2 0 13 A03 3 0 14 A03 4 0 15 A04 0 1 16 A04 1 0 17 A04 2 1 18 A04 3 0 19 A04 4 1
内容的提问来源于stack exchange,提问作者Jason Shi
相关产品推荐
相关产品推荐

