基于Pandas按MAT列条件计算WT的技术咨询
问题描述
我有一个DataFrame,之前用以下代码计算WT字段:
DF['T.U']=DF['WIDE']*DF['LENGTH']*DF['QTY']/1000000+DF['CLAD_THK']*DF['LENGTH']*DF['QTY']/1000000 DF['U.W']=DF['THK']*78.5/10 + DF['CLAD_THK']*79.9/10 DF['W.T']=DF['T.U']*DF['U.W'] DF['W.T']=DF['WT']/1000
现在需要根据MAT列的取值做条件计算:
- 当
MAT=516时,使用上述原有计算逻辑 - 当
MAT=240时,仅调整U.W的计算逻辑(把THK的系数从78.5换成79.9),其余步骤不变
解决方案
在Pandas中可以通过向量化条件运算实现,避免低效循环,以下是两种常用实现方式:
方式一:用numpy.where实现分支计算
核心是针对U.W列根据MAT值选择对应计算式,其余字段因两种场景逻辑一致,可统一计算:
import numpy as np import pandas as pd # 统一计算T.U(两种MAT值的逻辑完全相同) DF['T.U'] = (DF['WIDE'] * DF['LENGTH'] * DF['QTY'] + DF['CLAD_THK'] * DF['LENGTH'] * DF['QTY']) / 1000000 # 根据MAT值分支计算U.W DF['U.W'] = np.where( DF['MAT'] == 516, DF['THK'] * 78.5 / 10 + DF['CLAD_THK'] * 79.9 / 10, np.where( DF['MAT'] == 240, DF['THK'] * 79.9 / 10 + DF['CLAD_THK'] * 79.9 / 10, np.nan # 可设置MAT非516/240时的默认值,比如保留原数据或设为NaN ) ) # 统一计算后续字段 DF['W.T'] = DF['T.U'] * DF['U.W'] DF['WT'] = DF['W.T'] * 1000 # 注:原代码最后一行逻辑疑似笔误,此处调整为通过W.T推导WT,若需反向操作可改回
方式二:用loc定位行后分别赋值
这种方式逻辑更直观,适合后续需扩展多分支的场景:
import pandas as pd # 统一计算T.U DF['T.U'] = (DF['WIDE'] * DF['LENGTH'] * DF['QTY'] + DF['CLAD_THK'] * DF['LENGTH'] * DF['QTY']) / 1000000 # 处理MAT=516的行 mask_516 = DF['MAT'] == 516 DF.loc[mask_516, 'U.W'] = DF.loc[mask_516, 'THK'] * 78.5 / 10 + DF.loc[mask_516, 'CLAD_THK'] * 79.9 / 10 # 处理MAT=240的行 mask_240 = DF['MAT'] == 240 DF.loc[mask_240, 'U.W'] = DF.loc[mask_240, 'THK'] * 79.9 / 10 + DF.loc[mask_240, 'CLAD_THK'] * 79.9 / 10 # 统一计算后续字段 DF['W.T'] = DF['T.U'] * DF['U.W'] DF['WT'] = DF['W.T'] * 1000
注意事项
原代码最后一行DF['W.T']=DF['WT']/1000逻辑存在矛盾(通常是先计算中间值再推导最终值),上述方案默认调整为通过W.T计算WT,若你的实际需求是用已有WT覆盖W.T,可将最后一行改回原代码逻辑。
内容的提问来源于stack exchange,提问作者ahmed ordy
相关产品推荐
相关产品推荐

