如何简化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
相关产品推荐
相关产品推荐

