PySpark按条件计数值
我有一个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
工作原理吗?
-
这里没有过滤器。双方
col("is_fav") == 1
并col("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)