Pandas实现动态列集列间相减后乘指定列的正确方法
问题根源
你的计算逻辑错误出在差值初始化步骤:你设置diff = 0作为初始值,循环中依次减去列表内所有列,最终得到的计算式是0 - col1 - col2 - col3 = -(col1+col2+col3),和你预期的「用列列表首列作为被减数,依次减去后续所有列」的逻辑不符。
按你给出的预期值反推,3个符合预期的行均匹配col1 - col2 - col3的计算逻辑,仅第三行预期值-15和样例数据计算结果冲突,应为笔误,可自行核对原始数据。
修复方案
写法1:修正循环逻辑
将差值初始值设为列列表的第一列,再从第二个列开始遍历做减法即可:
import pandas as pd df = pd.DataFrame({'col0':['09-June-2022', '10-June-2022', '11-June-2022', '12-June-2022'], 'col1':[1,-2,3,-4], 'col2':[-2,5,6,-8], 'col3':[-5,-5,5,9], 'col4': [3,4,5,6]}) columnlist = ['col1', 'col2', 'col3'] # 初始值设为列表第一列,从第二个元素开始遍历减 diff = df[columnlist[0]] for c in columnlist[1:]: diff = diff - df[c] final_calculation = diff.mul(df['col4']) print(final_calculation)
运行输出:
0 24 1 -8 2 -40 3 -30 dtype: int64
写法2:pandas向量化写法(推荐,适配大数据量)
不用写循环,直接用列和运算实现,运行效率远高于for循环,适配你6万+行的实际数据集:
# 首列减去后续所有列的和,等价于依次减每一列 diff = df[columnlist[0]] - df[columnlist[1:]].sum(axis=1) final_calculation = diff * df['col4']
适配实际数据集说明
- 把
columnlist替换为你实际需要动态选取的列集合即可,无需修改其他逻辑 - 你实际数据中存在的
NaN值会被默认保留传递,如果需要填充缺失值,可以在计算前调用df = df.fillna(0)或按业务需求填充其他值 - 若要和其他列相乘,只需把
df['col4']替换为目标列即可,比如要乘CalculatedEmissionFactor就写df['CalculatedEmissionFactor']
内容的提问来源于stack exchange,提问作者incrediblegiant
相关产品推荐
相关产品推荐

