在Pandas DataFrame中优化实现分组行求和与学生总分动态更新
Pandas高效处理动态权重下的学生成绩计算
先搞定数据预处理
首先把两张表调整成Pandas易处理的结构:
- 学生成绩表(假设命名为
df_scores):将姓名作为唯一标识列,其余列是科目成绩,转成长格式并剔除空值:
df_scores_long = df_scores.melt(id_vars='姓名', var_name='科目', value_name='分数').dropna()
- 权重表(假设命名为
df_weights):保留学期、科目、权重三列即可,无需额外处理。
用矢量化运算替代低效循环
别用lambda遍历,Pandas的合并+矢量化计算才是高效方案,比普通for循环快几个量级:
- 按科目合并两张表:
merged_df = pd.merge(df_scores_long, df_weights, on='科目')
- 直接计算
分数×权重:
merged_df['分数×权重'] = merged_df['分数'] * merged_df['权重']
按学期输出结果到文件
按学期分组处理,直接输出每个科目计算值和学生总分:
with open('score_calculations.txt', 'w', encoding='utf-8') as f: for term, term_group in merged_df.groupby('学期'): # 输出每个科目的计算结果 for _, row in term_group.iterrows(): f.write(f"{row['科目']}: {row['分数×权重']:.2f}\n") # 计算并输出学生总分 student_totals = term_group.groupby('姓名')['分数×权重'].sum() for name, total in student_totals.items(): f.write(f"{name}: {total:.2f}\n")
输出格式完全匹配你给出的示例,且效率拉满。
跟踪学生总分变化
要识别总分变化,直接提取各学期的学生总分并计算差值即可:
# 按学生和学期汇总总分 student_term_totals = merged_df.groupby(['姓名', '学期'])['分数×权重'].sum().unstack() # 计算相邻学期的总分变化 score_changes = student_term_totals.diff(axis=1) # 可将变化结果输出到文件 score_changes.to_csv('score_changes.csv', encoding='utf-8')
内容的提问来源于stack exchange,提问作者Anna
相关产品推荐
相关产品推荐

