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
相关产品推荐
相关产品推荐

