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

PySpark中如何将列值转换为表头并实现行列转置?

PySpark DataFrame 行列转换实现

要将你的长格式DataFrame转换为以id值为列名的宽格式结构,可以通过**pivot(透视)**操作实现,步骤如下:

1. 准备示例数据(可选,用于测试)

先创建你提供的原始DataFrame:

from pyspark.sql import SparkSession
from pyspark.sql.functions import col
from pyspark.sql.types import StructType, StructField, StringType, IntegerType

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

data = [
    ("id001", "Mon", 9), ("id001", "Tue", 8), ("id001", "Wed", 7),
    ("id002", "Mon", 10), ("id002", "Tue", 10), ("id002", "Wed", 11),
    ("id003", "Mon", 1), ("id003", "Tue", 2), ("id003", "Wed", 3)
]

schema = StructType([
    StructField("id", StringType(), True),
    StructField("day", StringType(), True),
    StructField("quantity", IntegerType(), True)
])

df = spark.createDataFrame(data, schema)

2. 执行透视转换

核心是利用pivot函数将id转为列,同时确保行顺序与day(Mon→Tue→Wed)对应:

# 定义day的顺序,保证行的排列符合预期
day_order = ["Mon", "Tue", "Wed"]

# 按day排序后执行透视,聚合取唯一的quantity值
pivoted_df = df.orderBy(col("day").asc_nulls_last()) \
               .groupBy() \
               .pivot("id") \
               .agg({"quantity": "first"})

# 调整列顺序(与目标结构对齐)
pivoted_df = pivoted_df.select("id001", "id002", "id003")

# 查看结果
pivoted_df.show()

结果说明

执行后得到的DataFrame与你需求的结构一致:

+-------+-------+-------+
| id001 | id002 | id003 |
+-------+-------+-------+
|      9|     10|      1|
|      8|     10|      2|
|      7|     11|      3|
+-------+-------+-------+

关键细节

  • orderBy(col("day").asc_nulls_last()):确保数据按Mon→Tue→Wed的顺序排列,避免透视后行顺序混乱
  • groupBy():无分组键,直接对全量数据透视
  • pivot("id"):将id的不同取值转为列名
  • agg({"quantity": "first"}):由于每个id+day组合唯一,取第一个值即可得到对应quantity

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 05:10:32