按指定列分组统计目标列中特定值的出现次数
按分组统计指定值的出现次数
你的DataFrame数据如下:
+-------------+--------+ | x | y | +-------------+--------+ | a| one| | a| one| | a| two| | b| one| | b| two| | c| one| +-------------+--------+
你需要按x分组,统计每个分组中y列等于"one"的出现次数,原代码df.groupBy(x).agg(countDistinct("one")).collect()的问题在于:countDistinct接收的是列名而非具体值,这里把"one"当作列名会导致错误,因为你的DataFrame里没有名为"one"的列。
正确解法
以下两种方法都能实现需求:
方法1:使用when + count
利用when标记符合条件的行,再用count统计非Null值的数量:
from pyspark.sql import functions as F # 分组统计 result_df = df.groupBy("x").agg( F.count(F.when(F.col("y") == "one", True)).alias("one_count") ) # 提取结果值(按x的顺序排列可加orderBy) output = [row.one_count for row in result_df.orderBy("x").collect()] print(output) # 输出: [2, 1, 1]
方法2:使用when + sum
将符合条件的行标记为1,不符合的标记为0,通过求和得到总次数:
from pyspark.sql import functions as F # 分组统计 result_df = df.groupBy("x").agg( F.sum(F.when(F.col("y") == "one", 1).otherwise(0)).alias("one_count") ) # 提取结果值 output = [row.one_count for row in result_df.orderBy("x").collect()] print(output) # 输出: [2, 1, 1]
内容的提问来源于stack exchange,提问作者user18373817
相关产品推荐
相关产品推荐

