代码之家  ›  专栏  ›  技术社区  ›  newleaf

pyspark计数行处于条件

  •  27
  • newleaf  · 技术社区  · 6 年前

    我有一个数据框

    test = spark.createDataFrame([('bn', 12452, 221), ('mb', 14521, 330),('bn',2,220),('mb',14520,331)],['x','y','z'])
    test.show()
    

    我需要根据以下条件计算行数:

    test.groupBy("x").agg(count(col("y")>12453),count(col("z")>230)).show()
    

    这给了

     +---+------------------+----------------+
     |  x|count((y > 12453))|count((z > 230))|
     +---+------------------+----------------+
     | bn|                 2|               2|
     | mb|                 2|               2|
     +---+------------------+----------------+
    

    这只是行数,而不是特定条件下的行数。

    3 回复  |  直到 6 年前
        1
  •  52
  •   akuiper    6 年前

    count 不求和 真的 s、 它只统计非空值的数量。要计算 真的 值,则需要将条件转换为1/0,然后 sum :

    import pyspark.sql.functions as F
    
    cnt_cond = lambda cond: F.sum(F.when(cond, 1).otherwise(0))
    test.groupBy('x').agg(
        cnt_cond(F.col('y') > 12453).alias('y_cnt'), 
        cnt_cond(F.col('z') > 230).alias('z_cnt')
    ).show()
    +---+-----+-----+
    |  x|y_cnt|z_cnt|
    +---+-----+-----+
    | bn|    0|    0|
    | mb|    2|    2|
    +---+-----+-----+
    
        2
  •  32
  •   Anconia    4 年前

    根据@Psidom答案,我的答案如下

    from pyspark.sql.functions import col,when,count
    
    test.groupBy("x").agg(
        count(when(col("y") > 12453, True)),
        count(when(col("z") > 230, True))
    ).show()
    
        3
  •  0
  •   mahdi hazratgholizadeh    3 年前

    计数函数跳过 null 值,以便您可以尝试以下操作:

    import pyspark.sql.functions as F
    
    def count_with_condition(cond):
        return F.count(F.when(cond, True))