pandas按指定列组沿行(axis=1)求和循环生成汇总列的实现
Pandas 指定多组列的行向求和实现方案
原代码的错误点
DataFrame.sum()方法本身没有columns这个传入参数,无法直接在求和方法里指定需要计算的列范围。正确的实现逻辑是先筛出对应列的子集,再对这个子集执行行向求和。
基础可运行版本(匹配你的需求)
完全对应「遍历二维列表、逐次生成trial0/trial1命名的求和列」的逻辑,修正后的代码如下:
import pandas as pd # 初始化原DataFrame base_columns = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R'] df = pd.DataFrame(columns=base_columns) sample_list = [['A','B','C'], ['D','E','F'], ['G','H','I'], ['J','K','L'], ['M','N','O'], ['P','Q','R']] for idx, col_group in enumerate(sample_list): # 先筛选当前组对应的所有列,再做行向求和 df[f'trial{idx}'] = df[col_group].sum(axis=1)
代码运行逻辑说明:
- 逐次遍历
sample_list的每个子列表,用df[col_group]取出当前子列表指定的列组成临时数据块 - 对临时数据块执行
sum(axis=1),即可得到每行上这几列的求和结果,赋值给命名规则为trial{编号}的新列
高性能优化版本
如果你的分组数量达到上百个、且原DataFrame行数较多,逐列赋值的循环会产生不必要的性能损耗,可以通过字典批量构造新列再一次性合并,运行速度会有明显提升:
# 批量构造所有新列的键值对 new_col_map = {} for idx, col_group in enumerate(sample_list): new_col_map[f'trial{idx}'] = df[col_group].sum(axis=1) # 一次性合并所有新列到原DataFrame df = pd.concat([df, pd.DataFrame(new_col_map)], axis=1)
常见问题提示
- 如果子列表里的列名不在原df的列范围内,会直接触发KeyError,建议正式运行前先做一次列名匹配校验
- 如果需要处理空值场景,可以在
sum方法中加入min_count=1参数,避免全空的列组求和结果被默认填充为0,用法为df[col_group].sum(axis=1, min_count=1) - 用空结构的DataFrame测试这段代码时,由于没有实际数值行,生成的trial列会是空值,属于正常现象,替换为实际业务数据后即可正常计算求和结果
内容的提问来源于stack exchange,提问作者Shion
相关产品推荐
相关产品推荐

