有条件计算总和

如何解决有条件计算总和

以下是我的数据,我正在使用parcel_id进行分组,如果需要 imprv_det_type_cd以MA开头

输入:

+------------+----+-----+-----------------+
|   parcel_id|year| sqft|imprv_det_type_cd|
+------------+----+-----+-----------------+
|000000100010|2014| 4272|               MA|
|000000100010|2014|  800|              60P|
|000000100010|2014| 3200|              MA2|
|000000100010|2014| 1620|              49R|
|000000100010|2014| 1446|              46R|
|000000100010|2014|40140|              45B|
|000000100010|2014| 1800|              45C|
|000000100010|2014|  864|              49C|
|000000100010|2014|    1|              48S|
+------------+----+-----+-----------------+

在这种情况下,从上方仅考虑两行。

预期输出:

+---------+-----------------+--------------------+----------+
|parcel_id|imprv_det_type_cd|structure_total_sqft|year_built|
+---------+-----------------+--------------------+----------+
|100010   |MA               |7472               |2014       |
+---------+-----------------+--------------------+----------+

代码:

# read APPRAISAL_IMPROVEMENT_DETAIL.TXT
def _transfrom_imp_detail():
    w_impr = Window.partitionBy("parcel_id")
    return(
    
        (spark.read.text(path_ade_imp_info)
            .select(
                F.trim(F.col("value").substr(1,12)).alias("parcel_id"),F.trim(F.col("value").substr(86,4)).cast("integer").alias("year"),F.trim(F.col("value").substr(94,15)).cast("integer").alias("sqft"),F.trim(F.col("value").substr(41,10)).alias("imprv_det_type_cd"),)
            .withColumn(
                    "parcel_id",F.regexp_replace('parcel_id',r'^[0]*','')
            )
            .withColumn("structure_total_sqft",F.sum("sqft").over(w_impr))
            .withColumn("year_built",F.min("year").over(w_impr))
        ).drop("sqft","year").drop_duplicates(["parcel_id"])
    )

我知道此代码中的.withColumn(“ structure_total_sqft”,F.sum(“ sqft”)。over(w_impr))有所更改,但不确定我必须做什么。我尝试了功能,但仍然无法正常工作。

先谢谢您

解决方法

我不知道您为什么要groupBy,但您不想这么做。

df.withColumn('parcel_id',f.regexp_replace('parcel_id',r'^[0]*','')) \
  .filter("imprv_det_type_cd like 'MA%'") \
  .groupBy('parcel_id','year') \
  .agg(f.sum('sqft').alias('sqft'),f.first(f.substring('imprv_det_type_cd',2)).alias('imprv_det_type_cd')) \
  .show(10,False)

+---------+----+------+-----------------+
|parcel_id|year|sqft  |imprv_det_type_cd|
+---------+----+------+-----------------+
|100010   |2014|7472.0|MA               |
+---------+----+------+-----------------+
,

使用 sum(when(..))

 df2.show(false)
    df2.printSchema()
    /**
      * +------------+----+-----+-----------------+
      * |parcel_id   |year|sqft |imprv_det_type_cd|
      * +------------+----+-----+-----------------+
      * |000000100010|2014|4272 |MA               |
      * |000000100010|2014|800  |60P              |
      * |000000100010|2014|3200 |MA2              |
      * |000000100010|2014|1620 |49R              |
      * |000000100010|2014|1446 |46R              |
      * |000000100010|2014|40140|45B              |
      * |000000100010|2014|1800 |45C              |
      * |000000100010|2014|864  |49C              |
      * |000000100010|2014|1    |48S              |
      * +------------+----+-----+-----------------+
      *
      * root
      * |-- parcel_id: string (nullable = true)
      * |-- year: string (nullable = true)
      * |-- sqft: string (nullable = true)
      * |-- imprv_det_type_cd: string (nullable = true)
      */

    val p = df2.groupBy(expr("cast(parcel_id as integer) as parcel_id"))
      .agg(
        sum(when($"imprv_det_type_cd".startsWith("MA"),$"sqft")).as("structure_total_sqft"),first("imprv_det_type_cd").as("imprv_det_type_cd"),first($"year").as("year_built")
      )
    p.show(false)
    p.explain()

    /**
      * +---------+--------------------+-----------------+----------+
      * |parcel_id|structure_total_sqft|imprv_det_type_cd|year_built|
      * +---------+--------------------+-----------------+----------+
      * |100010   |7472.0              |MA               |2014      |
      * +---------+--------------------+-----------------+----------+
      */

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-