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
相关产品推荐
相关产品推荐

