如何在Pandas中使用lambda与if条件按岗位类型计算薪资费率
你现有代码存在两个核心错误:
- 你对
df['Job']单列调用apply,lambda接收的参数是Job字段的单个字符串值,既无法访问同一条数据的Total shift hours字段,x[Payrate]的写法也不符合语法规则,不能用字典作为索引去取字符串的下标。 - 判断逻辑错误,你需要先判断当前岗位是否存在于
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
相关产品推荐
相关产品推荐

