Spark DataFrame按列值区分计算累计值 如何排除0值参与累计均值计算
解决方案
你只需要在计算brand3的累计均值时,先将TrueValue为0的值替换为null(Spark的avg函数会自动忽略null值,不会纳入统计),再匹配你给出的预期中当前行TrueValue为0时直接返回0的规则即可,修改后的代码如下:
windowval = (Window.partitionBy('Location','Brand').orderBy('month_in_timestamp') .rangeBetween(Window.unboundedPreceding, 0)) df = df.withColumn('TotalSumValue', F.when(F.col('Brand') == 'brand2', F.sum('TrueValue').over(windowval)) \ .when(F.col('Brand') == 'brand3', F.when(F.col('TrueValue') == 0, F.lit(0.0)) .otherwise(F.avg(F.when(F.col('TrueValue') != 0, F.col('TrueValue'))).over(windowval)) ) )
如果你的实际需求不需要当前行值为0时返回0,只需要忽略0值计算累计均值,哪怕当前行是0也返回前面非0值的平均,去掉内层的判断即可,对应代码段为:
F.avg(F.when(F.col('TrueValue') != 0, F.col('TrueValue'))).over(windowval)
内容的提问来源于stack exchange,提问作者user175025
相关产品推荐
相关产品推荐

