Pandas如何不指定列名对多列批量运算并生成新列
Pandas 多列通用计算逐行求和追加新列方案
原代码报错原因
- 列名生成逻辑错误:
range(len(df.columns))默认从0开始计数,第一次循环生成的列名是A0,和数据集实际存在的A1起始列名不匹配,触发KeyError - 存在多处笔误:定义的函数名为
construct_matrix,调用时写成了matrix_constructor;最后打印的变量为未定义的df_read,和实际读取数据存储的df变量名不一致
推荐实现(向量化运算,性能最优)
不需要逐列手写公式,也不需要显式写循环,利用pandas原生的整表向量化计算即可,运行效率远高于逐列循环,代码也更简洁。
- 如果你的DataFrame中只有A1~A120需要参与计算的列,无其他无关列,直接用如下代码:
import pandas as pd df = pd.read_csv('sample.csv') # 对所有值做平方减自身计算,再按行求和赋值给新列 df['calc'] = (df ** 2 - df).sum(axis=1)
- 如果DataFrame中存在其他不需要参与计算的列,可以先筛选目标列再运算,避免无关值干扰结果:
import pandas as pd df = pd.read_csv('sample.csv') # 筛选所有列名以A开头加数字格式的目标列 target_columns = df.columns[df.columns.str.match(r'^A\d+$')] df['calc'] = (df[target_columns] ** 2 - df[target_columns]).sum(axis=1)
参数说明:
sum(axis=1)指定按行方向做求和,即对每一行所有列的计算结果加总,完全匹配你需要的计算规则。
修正后的循环写法(仅作参考,不推荐生产环境使用)
如果要保留原循环逻辑,修正索引偏移和笔误问题后也可正常运行,但数据量较大时性能会明显差于向量化方案:
import pandas as pd df = pd.read_csv('sample.csv') def construct_matrix(): temp_sumsqc = 0 # 索引从1开始,匹配A1~A120的列名规则 for i in range(1, len(df.columns) + 1): col_name = f'A{i}' temp_sumsqc += df[col_name] ** 2 - df[col_name] df["calc"] = temp_sumsqc # 统一变量名和函数名 construct_matrix() print(df.to_string())
内容的提问来源于stack exchange,提问作者Archibald
相关产品推荐
相关产品推荐

