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

如何在Pandas中使用lambda与if条件按岗位类型计算薪资费率

你现有代码存在两个核心错误:

  1. 你对df['Job']单列调用apply,lambda接收的参数是Job字段的单个字符串值,既无法访问同一条数据的Total shift hours字段,x[Payrate]的写法也不符合语法规则,不能用字典作为索引去取字符串的下标。
  2. 判断逻辑错误,你需要先判断当前岗位是否存在于Payrate的键中,再执行对应计算。

推荐实现方案(性能最优,向量化操作)

import numpy as np

Payrate = {
    'NH': 14.00,
    'W1': 14.00,
    'W2': 14.00,
    'W3': 14.00,
    'M': 14.00,
    'NHLC': 14.00,
    'E': 14.00,
}

df = df.fillna(0)
df['Total shift hours'] = df['Total shift hours'].astype(int)

# 预计算全表总工时,避免重复计算
total_shift_sum = df['Total shift hours'].sum()

# 匹配每个岗位对应的费率,不存在的返回NaN
df['rate'] = df['Job'].map(Payrate)

# 按规则计算Hours
df['Hours'] = np.where(
    df['rate'].notna(),
    (df['rate'] * df['Total shift hours']) / 12.33,
    total_shift_sum
).round(2)

# 可选:删除临时生成的rate列
df.drop('rate', axis=1, inplace=True)

lambda apply 实现方案(仅适合小数据量场景)

如果一定要用lambda按行遍历实现,需要对整个DataFrame调用apply,指定axis=1按行处理:

total_shift_sum = df['Total shift hours'].sum()

df['Hours'] = df.apply(
    lambda row: (Payrate[row['Job']] * row['Total shift hours'])/12.33 if row['Job'] in Payrate else total_shift_sum,
    axis=1
).round(2)

如果你的需求中,未匹配到的岗位是取当前行的Total shift hours而非全表总工时,把上面代码里的total_shift_sum替换为row['Total shift hours']即可。


内容的提问来源于stack exchange,提问作者cchev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 12:27:05