python - PySpark 按条件计算值

标签 python apache-spark pyspark

我有一个 DataFrame,这里有一个片段:

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

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

我需要做的是在第一个字段上分组并计算 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") == 1col("is_fav") == 0) 都是 bool 表达式而 count 不是只要它被定义,就真的不关心它们的值(value)。

有很多方法可以解决这个问题,例如使用简单的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)

关于python - PySpark 按条件计算值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36072278/

相关文章:

python - Facebook api 图访问 token

performance - Spark : why is a subselect with "NOT IN" dramatically slower than "IN"?

java - 如何使用 foreach 迭代 JavaRDD 并使用 spark java 从每一行中查找特定元素

pyspark - 如何从pyspark的数据框中删除空列

python - 从 PySpark 中的两个不同数据框中减去列的值以查找 RMSE

python - 基于另一个数组中的信息对 NumPy 数组进行操作

python - 如何通过 psutil 获取磁盘 IO 和网络使用百分比

scala - 如何仅将 "cube"用于 Spark 数据帧上的特定字段?

azure - 使用 pyspark 将多个 csv 文件合并到 Azure Blob 存储中的一个 csv 文件

Python - Tkinter - 图形用户界面