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

如何将PySpark DataFrame转换为指定的宽表格式?

解决Spark DataFrame长表转宽表的问题

嘿,我懂你想要把这个长格式DataFrame转换成指定宽格式的需求啦!其实Spark内置的pivot函数就是干这个的,你之前没接触过它很正常,咱们一步步来实现:

步骤1:创建目标列名字段

首先我们需要把str和num拼接成str_num格式的列名,这里要注意把num转成字符串类型,避免拼接时出现类型问题:

from pyspark.sql.functions import concat, lit, col

# 添加新列存储拼接后的目标列名
df_with_col = df_spark.withColumn("col_name", concat(col("str"), lit("_"), col("num").cast("string")))

步骤2:分组+pivot转换格式

接下来通过groupBy按id分组,再用pivot把刚才生成的col_name字段的所有唯一值转成新的列,最后聚合取出对应的val值(你的数据里每个id+col_name组合只有一个val,用first聚合就足够):

# 执行分组、透视和聚合操作
result_df = df_with_col.groupBy("id").pivot("col_name").agg({"val": "first"})

# 查看结果
result_df.show()

执行后你就能得到想要的格式:

+---+-----+-----+-----+-----+-----+
| id|abc_1|abc_2|abc_3|def_3|def_9|
+---+-----+-----+-----+-----+-----+
| 11|  114|  104| null| null|  113|
| 12|   14| null| null|  110| null|
| 14|  194|  164|  104| null| null|
+---+-----+-----+-----+-----+-----+

(注:Spark里的null在显示效果上和你示例里的NaN等价,如果需要统一显示为NaN,可以后续用na.fill或者转换为Pandas DataFrame处理)

补充说明

如果你的数据里存在同一个id+col_name对应多个val的情况,可以把聚合函数换成sum、max等,根据实际需求选择合适的方式合并值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:28:57