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

在Pandas DataFrame中优化实现分组行求和与学生总分动态更新

Pandas高效处理动态权重下的学生成绩计算

先搞定数据预处理

首先把两张表调整成Pandas易处理的结构:

  • 学生成绩表(假设命名为df_scores):将姓名作为唯一标识列,其余列是科目成绩,转成长格式并剔除空值:
df_scores_long = df_scores.melt(id_vars='姓名', var_name='科目', value_name='分数').dropna()
  • 权重表(假设命名为df_weights):保留学期、科目、权重三列即可,无需额外处理。

用矢量化运算替代低效循环

别用lambda遍历,Pandas的合并+矢量化计算才是高效方案,比普通for循环快几个量级:

  1. 按科目合并两张表:
merged_df = pd.merge(df_scores_long, df_weights, on='科目')
  1. 直接计算分数×权重:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 10:12:45