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

PySpark按公司分组 基于Bonus值计算薪资合计分栏展示

解决方案

你可以通过条件聚合实现需求,核心是用when函数区分有奖金和无奖金的员工,再分别完成求和计算:

代码示例

假设你的DataFrame名为df,执行以下代码:

from pyspark.sql import functions as F

result_df = df.groupBy("COMPANY") \
    .agg(
        # 无奖金的薪资总和:筛选BONUS为null或0的员工,求和其SALARY
        F.sum(F.when((F.col("BONUS").isNull()) | (F.col("BONUS") == 0), F.col("SALARY")).otherwise(0)).alias("TOT_AMT_NO_BONUS"),
        # 有奖金的薪资总和:筛选BONUS非空且大于0的员工,求和其SALARY+BONUS
        F.sum(F.when((F.col("BONUS").isNotNull()) & (F.col("BONUS") > 0), F.col("SALARY") + F.col("BONUS")).otherwise(0)).alias("TOTAL_BONUS")
    )

逻辑说明

  • groupBy("COMPANY"):按公司分组,EMPID因未参与分组会自动被忽略
  • 第一个聚合项:判断员工是否无奖金(BONUS为null或等于0),符合条件则取对应SALARY,否则取0,最终求和得到TOT_AMT_NO_BONUS
  • 第二个聚合项:判断员工是否有奖金(BONUS非空且大于0),符合条件则取SALARY+BONUS,否则取0,最终求和得到TOTAL_BONUS

如果你的TOTAL_BONUS实际指奖金总额而非薪资加奖金,只需修改第二个聚合项的计算逻辑:

F.sum(F.when((F.col("BONUS").isNotNull()) & (F.col("BONUS") > 0), F.col("BONUS")).otherwise(0)).alias("TOTAL_BONUS")

验证示例

假设原始数据:

COMPANYEMPIDBONUSSALARY
A11005000
A2null4000
B306000
B42007000

运行代码后输出:

COMPANYTOT_AMT_NO_BONUSTOTAL_BONUS
A40005100
B60007200

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:15:01