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

PySpark中如何将DataFrame的多行多字段转置为多列

PySpark中如何将DataFrame的多行多字段转置为多列

嗨,我来帮你搞定这个问题!你完全不用非得拆分两个中间表再做join,其实用一次pivot配合多字段聚合就能轻松实现需求,效率还更高~

首先,先还原你的初始DataFrame:

from pyspark.sql import SparkSession
from pyspark.sql import functions as f

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

# 初始数据
data = [
    ("S1", "A", 1, 10),
    ("S1", "B", 2, 15),
    ("S2", "A", 3, 20),
    ("S2", "B", 4, 25)
]
df = spark.createDataFrame(data, ["Code", "Cat", "Count", "Value"])

接下来就是核心操作:在groupBy("Code")之后用pivot("Cat"),然后在agg里同时指定对Count和Value的聚合逻辑(这里用first是因为每个Code+Cat组合是唯一的,用sum也能得到同样结果):

# 一次pivot完成多字段聚合
pivoted_df = df.groupBy("Code").pivot("Cat").agg(
    f.first("Count").alias("Count"),
    f.first("Value").alias("Value")
)

这时候你得到的列名会是Code、A_Count、A_Value、B_Count、B_Value,如果需要改成你想要的Count A、Value A这种格式,可以动态重命名列(不用硬编码Cat的取值,扩展性更好):

# 动态生成列重命名规则
renamed_columns = []
for col in pivoted_df.columns:
    if col == "Code":
        renamed_columns.append(f.col(col))
    else:
        # 拆分列名,比如A_Count → Count A
        cat, metric = col.split("_")
        new_col_name = f"{metric} {cat}"
        renamed_columns.append(f.col(col).alias(new_col_name))

# 应用重命名得到最终DataFrame
final_df = pivoted_df.select(*renamed_columns)

最后看一下final_df的结果,完全符合你想要的格式:

CodeCount AValue ACount BValue B
S1110215
S2320425

这样就不用拆分两次再join啦,一次操作搞定,代码也更简洁易维护~

备注:内容来源于stack exchange,提问作者andrex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 10:23:12