解释:
结果表需包含所有学生和所有科目(即便测试次数为0):
Alice 参加了 3 次数学测试, 2 次物理测试,以及 1 次编程测试;
Bob 参加了 1 次数学测试, 1 次编程测试,没有参加物理测试;
Alex 啥测试都没参加;
John 参加了数学、物理、编程测试各 1 次。
import pandas as pd
def students_and_examinations(students: pd.DataFrame, subjects: pd.DataFrame, examinations: pd.DataFrame) -> pd.DataFrame:
grouped = examinations.groupby(['student_id','subject_name']).size().reset_index(name='attended_exams')
merged_cross = pd.merge(students,subjects,how='cross')
#how='cross' 参数可以实现两个 DataFrame 的笛卡尔积
redf = pd.merge(merged_cross,grouped,on=['student_id','subject_name'],how='left')
redf['attended_exams']=redf['attended_exams'].fillna(0).astype(int)
redf.sort_values(['student_id', 'subject_name'], inplace=True)
return redf