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

如何使用Python展开DataFrame中的多个数组列

解决DataFrame列表列展开问题

针对你描述的DataFrame结构,可通过以下步骤实现需求:

核心思路

  1. 将单元素列表列(Name、Age)提取为普通字段;
  2. 把多元素列表列(Subjects、Grades)按位置配对打包成结构体数组;
  3. 展开结构体数组为多行,并重命名列名匹配目标格式。

Python Spark 代码实现

from pyspark.sql import functions as F

# 假设原始DataFrame名为df
df_result = df.withColumn("Name", F.col("Name").getItem(0)) \
              .withColumn("Age", F.col("Age").getItem(0)) \
              # 配对Subjects和Grades的对应元素
              .withColumn("pair", F.array_zip(F.col("Subjects"), F.col("Grades"))) \
              # 展开结构体数组为多行
              .selectExpr("Name", "Age", "inline(pair)") \
              # 重命名展开后的列
              .withColumnRenamed("0", "Subjects") \
              .withColumnRenamed("1", "Grades")

# 查看结果
df_result.show()

Scala Spark 代码实现

import org.apache.spark.sql.functions._

// 假设原始DataFrame名为df
val dfResult = df.withColumn("Name", col("Name")(0))
                 .withColumn("Age", col("Age")(0))
                 .withColumn("pair", array_zip(col("Subjects"), col("Grades")))
                 .selectExpr("Name", "Age", "inline(pair)")
                 .withColumnRenamed("_1", "Subjects")
                 .withColumnRenamed("_2", "Grades")

// 查看结果
dfResult.show()

说明

  • 单元素列表列提取:用getItem(0)或直接索引(0)取出列表中的唯一元素,转为普通字段;
  • array_zip:将两个列表的对应位置元素打包成结构体,确保Subjects和Grades的元素一一对应;
  • inline:把结构体数组展开为多行,每行对应一组Subject-Grade配对,同时保留Name和Age的重复值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:00:56