You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySpark中按SubType透视并聚合各Type的子类型计数?

PySpark透视DataFrame实现按Type统计各SubType数量

你的代码逻辑本身没问题,唯一的问题是pivot后缺失的SubType分组会显示null,而不是你期望的0。只需要在聚合后添加fillna(0)来填充空值即可。

可行解决方案

from pyspark.sql import functions as F

# 基于你的原始DataFrame执行以下代码
df_result = df \
    .groupBy("Type") \
    .pivot("SubType") \
    .agg(F.count("SubType")) \
    .fillna(0)  # 将空值替换为0

df_result.show()

代码说明

  • groupBy("Type"):按Type字段分组,作为透视结果的行维度
  • pivot("SubType"):将SubType的不同取值转换为透视结果的列维度
  • agg(F.count("SubType")):统计每个Type分组下各SubType的出现次数,这一步你的原代码逻辑是正确的
  • fillna(0):关键补全步骤,把Type未对应到的SubType的空值替换为0,完全匹配你期望的输出格式

测试验证(可选)

如果需要快速验证效果,可以先创建测试数据集:

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("PivotTest").getOrCreate()

test_data = [
    ("Type1", "SubType 1"),
    ("Type1", "SubType 1"),
    ("Type1", "SubType 1"),
    ("Type1", "SubType 2"),
    ("Type1", "SubType 3"),
    ("Type2", "SubType 1"),
    ("Type2", "SubType 1"),
    ("Type2", "SubType 2"),
    ("Type2", "SubType 2"),
    ("Type2", "SubType 2"),
    ("Type2", "SubType 3"),
    ("Type2", "SubType 3"),
    ("Type3", "SubType 1"),
    ("Type3", "SubType 1")
]

df = spark.createDataFrame(test_data, ["Type", "SubType"])

# 执行解决方案代码
df_result = df.groupBy("Type").pivot("SubType").agg(F.count("SubType")).fillna(0)
df_result.show()

执行后会输出你想要的结果:

+-----+-----------+-----------+-----------+
| Type|SubType 1  |SubType 2  |SubType 3  |
+-----+-----------+-----------+-----------+
|Type1|          3|          1|          1|
|Type2|          2|          3|          2|
|Type3|          2|          0|          0|
+-----+-----------+-----------+-----------+

内容的提问来源于stack exchange,提问作者SaurabhShelar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 02:33:29