如何使用Python展开DataFrame中的多个数组列
解决DataFrame列表列展开问题
针对你描述的DataFrame结构,可通过以下步骤实现需求:
核心思路
- 将单元素列表列(Name、Age)提取为普通字段;
- 把多元素列表列(Subjects、Grades)按位置配对打包成结构体数组;
- 展开结构体数组为多行,并重命名列名匹配目标格式。
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
相关产品推荐
相关产品推荐

