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

Python pandas多列对应相乘求和是否有简化实现方法?

DataFrame成对列加权求和简化方案

你不需要额外引入其他第三方库,Pandas原生就支持多种简洁实现,完全可以替代逐列硬编码的写法:

  • 向量化点乘方案(最推荐,性能最好、扩展性最强)
    只要按规则提取课程列、对应学分列,直接做向量化运算即可,和你手写的计算逻辑完全一致,后续新增课程列也不需要修改代码:
# 批量提取对应列
course_cols = [c for c in df.columns if c.startswith('Course')]
weight_cols = [c for c in df.columns if c.startswith('Score_')]
# 按行求和得到总分
df['total'] = (df[course_cols].to_numpy() * df[weight_cols].to_numpy()).sum(axis=1)

这个写法用了Pandas底层的numpy向量化运算,就算是百万行级别的数据计算速度也非常快,而且不用纠结两组列的列名大小写、命名细节,只要保证两组列的顺序一一对应就行。

  • for循环实现(适合入门理解逻辑)
    如果刚接触想先理清楚计算逻辑,用循环逐对列累加也可以实现,写法比硬编码灵活:
df['total'] = 0
for c_col, w_col in zip(course_cols, weight_cols):
    df['total'] += df[c_col] * df[w_col]

注意这个写法因为是Python层面的循环,数据量超过10万行的时候运算效率会明显比向量化方案低,只适合小数据量场景或者学习逻辑用。

  • 列名对齐计算方案(适合列名完全规范的场景)
    如果你后续把列名统一成完全对应的格式(比如把Score_course1改成Score_Course1,和Course1的命名规则完全匹配),还可以直接按列名对齐做乘法,连列顺序都不需要手动核对:
# 提取学分列并去掉前缀,和课程列名对齐
weight_df = df.filter(like='Score_').rename(columns=lambda x: x.replace('Score_', ''))
course_df = df.filter(like='Course')
# 列名自动匹配后按行求和
df['total'] = course_df.mul(weight_df).sum(axis=1)

注意:你当前提供的示例数据里第一列学分的列名是Score_course1(course首字母小写),和课程列Course1大小写不匹配,直接用这个方法会出现匹配缺失的空值,需要先统一列名格式再使用。

内容的提问来源于stack exchange,提问作者machine learning newbie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 08:21:31