You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 02:20:37