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

如何在PySpark中转置指定列(time与value)重构DataFrame?

PySpark DataFrame 实现time与value列的行转列

原始数据

year    week    date    time          value
2020    1     20201203  2:00 - 2:15    23.9
2020    1     20201203  2:15 - 2:30    45.87
2020    1     20201203  2:30 - 2:45    87.76
2020    1     20201203  2:45 - 3:00    12.87

期望输出

year   week    date    2:00 - 2:15     2:15 - 2:30     2:30 - 2:45    2:45 - 3:00
 2020   1     20201203    23.9             45.87           87.76          12.87

解决方案

使用PySpark的groupBy+pivot组合即可实现这类行转列需求,这是处理宽表转换的标准方法:

from pyspark.sql import SparkSession
from pyspark.sql.functions import first

# 初始化SparkSession(若未初始化)
spark = SparkSession.builder.appName("pivot_demo").getOrCreate()

# 创建示例DataFrame(替换为你的实际数据源)
data = [
    (2020, 1, 20201203, "2:00 - 2:15", 23.9),
    (2020, 1, 20201203, "2:15 - 2:30", 45.87),
    (2020, 1, 20201203, "2:30 - 2:45", 87.76),
    (2020, 1, 20201203, "2:45 - 3:00", 12.87)
]
df = spark.createDataFrame(data, ["year", "week", "date", "time", "value"])

# 执行行转列操作
pivoted_df = df.groupBy("year", "week", "date") \
               .pivot("time") \
               .agg(first("value"))

# 查看结果
pivoted_df.show(truncate=False)

代码说明

  1. groupBy:指定转换后保留的分组列(year、week、date),确保这些列的组合在结果中每行唯一。
  2. pivot:指定要转置为新列的字段(time),该字段的所有唯一取值会成为结果表的新列名。
  3. agg(first("value")):因为每个分组+time组合仅对应一个value值,用first直接提取即可;若存在重复数据,可根据需求替换为sum、avg等聚合函数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:20:34