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的结果,完全符合你想要的格式:
| Code | Count A | Value A | Count B | Value B |
|---|---|---|---|---|
| S1 | 1 | 10 | 2 | 15 |
| S2 | 3 | 20 | 4 | 25 |
这样就不用拆分两次再join啦,一次操作搞定,代码也更简洁易维护~
备注:内容来源于stack exchange,提问作者andrex
相关产品推荐
相关产品推荐

