在PySpark中按gcol分组统计ccol1值计数(含Null)的实现方法
PySpark分组统计含Null值的字段出现次数
核心方案:直接多字段分组计数
不需要使用pivot,你的需求是保留ccol1的每个值(包括Null)作为行记录,统计每组内的频次,直接通过多字段分组+计数即可实现,Spark默认会将Null值作为合法的分组键。
PySpark 代码实现
from pyspark.sql import SparkSession from pyspark.sql.functions import count # 初始化SparkSession spark = SparkSession.builder.appName("CountWithNull").getOrCreate() # 创建测试DataFrame data = [ ("a", 1, "apple"), ("b", 1, "orange"), ("a", 2, None), ("b", 1, "orange"), ("b", 1, "orange") ] df = spark.createDataFrame(data, ["gcol1", "gcol2", "ccol1"]) # 分组统计:按gcol1、gcol2、ccol1分组,计算每组数量 result_df = df.groupBy("gcol1", "gcol2", "ccol1").agg(count("*").alias("count")) # 查看结果 result_df.show()
执行后输出结果与期望一致:
+-----+-----+------+-----+ |gcol1|gcol2| ccol1|count| +-----+-----+------+-----+ | a| 1| apple| 1| | a| 2| null| 1| | b| 1|orange| 3| +-----+-----+------+-----+
转换为Pandas DataFrame的方案
如果需要转成Pandas处理,代码如下:
# 转换为Pandas DataFrame并统计 pandas_df = df.toPandas() pandas_result = pandas_df.groupby(["gcol1", "gcol2", "ccol1"], dropna=False).size().reset_index(name="count") print(pandas_result)
这里显式指定dropna=False,确保Pandas分组时保留Null值(默认也会保留,但显式指定更稳妥)。输出结果:
gcol1 gcol2 ccol1 count 0 a 1 apple 1 1 a 2 NaN 1 2 b 1 orange 3
内容的提问来源于stack exchange,提问作者abkf12
相关产品推荐
相关产品推荐

