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

如何在PySpark DataFrame中将两列合并为行

PySpark合并多列为单列的解决方案

输入与期望输出

输入DataFrame

IdTime Interval 1Time Interval 2
14w24d
18w12d

期望输出DataFrame

IdTime Interval
14w
18w
112d
124d

解决方案

方法1:使用stack函数(推荐,高效简洁)

stack函数可直接将多列转换为多行,适合批量合并列的场景:

from pyspark.sql import SparkSession
from pyspark.sql.functions import expr

# 初始化SparkSession(未初始化时执行)
spark = SparkSession.builder.appName("CombineTimeIntervals").getOrCreate()

# 构造输入DataFrame
data = [(1, "4w", "24d"), (1, "8w", "12d")]
df = spark.createDataFrame(data, ["Id", "Time Interval 1", "Time Interval 2"])

# 合并列
result_df = df.select(
    "Id",
    expr("stack(2, 'Time Interval 1', `Time Interval 1`, 'Time Interval 2', `Time Interval 2`) as (original_col, `Time Interval`)")
).drop("original_col")

# 查看结果
result_df.show()

代码说明:

  • stack(2, ...)中的2代表要合并的列数量;
  • 每一组'列名', 列值对应原DataFrame中的一列;
  • 通过drop("original_col")移除不需要的原列名字段。

方法2:使用union合并子DataFrame

列数较少时,可分别提取列后用union合并:

from pyspark.sql import SparkSession

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

data = [(1, "4w", "24d"), (1, "8w", "12d")]
df = spark.createDataFrame(data, ["Id", "Time Interval 1", "Time Interval 2"])

# 分别提取两列并重命名
df_interval1 = df.select("Id", df["Time Interval 1"].alias("Time Interval"))
df_interval2 = df.select("Id", df["Time Interval 2"].alias("Time Interval"))

# 合并两个DataFrame
result_df = df_interval1.union(df_interval2)

result_df.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:55:15