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

如何简化pandas多组配对列相乘后求和的实现代码?

Pandas 对应列加权求和简化方案
  • 你之前的简化代码存在两个核心问题,另外原始手写公式也有笔误:
    • 列名匹配逻辑错误:代码中用数字i拼接列名,但实际列名后缀是科目字符串(math/chemistry/physic),无法匹配到目标列
    • 遍历范围错误:range(1,3)只会生成1、2两个值,漏了物理科目的计算项
    • 手写公式笔误:你贴的原始计算式末尾缺少一个右括号,运行会触发语法错误,补上即可

方案1:最小改动修正版(和原写法逻辑完全对齐)

直接遍历科目名后缀做列名拼接,不需要用数字下标,写法直观不容易错:

# 列出需要计算的科目后缀
subject_list = ["math", "chemistry", "physic"]
df["total"] = sum(df[f"grade_{sub}"] * df[f"CS_{sub}"] for sub in subject_list)

说明:这个写法的计算逻辑和你手写的逐列相乘再相加完全一致,pandas会自动对同索引的Series做逐行运算,适合科目数量不多的场景。

方案2:pandas原生向量化写法(性能更优,适合多列场景)

如果后续科目会新增、不想手动维护科目列表,可以直接按列名前缀筛选目标列,做向量化运算,数据量大时性能比循环写法更好:

# 筛选同组列,排序保证两组列的科目顺序一一对应
grade_columns = sorted(col for col in df.columns if col.startswith("grade_"))
cs_columns = sorted(col for col in df.columns if col.startswith("CS_"))

# 对应列逐行相乘后,按行求和得到总分
df["total"] = df[grade_columns].mul(df[cs_columns].to_numpy()).sum(axis=1)

注意:使用这个方法必须确认两组筛选出来的列顺序完全对应,加sorted()是为了避免列顺序混乱导致计算错位。

以上两种方案用你提供的示例DataFrame计算,结果和手写公式完全一致:ID为1的行total值为26.5,ID为2的行total值为29,ID为3的行total值为16。

内容的提问来源于stack exchange,提问作者skywalker56

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:42:28