PySpark按条件计数值

发布于 2021-01-29 16:04:48

我有一个DataFrame,这里是一个代码段:

[['u1', 1], ['u2', 0]]

基本上是一个字符串字段f,第二个元素(is_fav)为1或0 。

我需要做的是在第一个字段上分组并计算1和0的出现次数。我希望做这样的事情

num_fav = count((col("is_fav") == 1)).alias("num_fav")

num_nonfav = count((col("is_fav") == 0)).alias("num_nonfav")

df.groupBy("f").agg(num_fav, num_nonfav)

它不能正常工作,在两种情况下我都得到相同的结果,该结果等于组中项目的计数,因此似乎忽略了过滤器(无论是1还是0)。这取决于count工作原理吗?

关注者
0
被浏览
52
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这里没有过滤器。双方col("is_fav") == 1col("is_fav") == 0)都只是布尔表达式,并count不会真正关心他们的价值,只要它被定义。

    您可以通过多种方法来解决此问题,例如,使用simple sum

    from pyspark.sql.functions import sum, abs
    
    gpd = df.groupBy("f")
    gpd.agg(
        sum("is_fav").alias("fv"),
        (count("is_fav") - sum("is_fav")).alias("nfv")
    )
    

    或将忽略的值设为未定义(也称为NULL):

    exprs = [
        count(when(col("is_fav") == x, True)).alias(c)
        for (x, c) in [(1, "fv"), (0, "nfv")]
    ]
    gpd.agg(*exprs)
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看