如何以Type列为后缀pivot为宽表?求Pandas/PySpark简洁实现
实现方案
两种框架都可以通过内置的透视函数快速实现需求,以下是具体代码:
Pandas 实现
直接使用pivot方法即可完成转换,缺失值会自动填充为NaN:
import pandas as pd # 示例输入数据构造(实际使用时替换为你自己的df) df = pd.DataFrame({ "Id": [1, 1, 2, 3], "Type": ["A", "B", "A", "C"], "Value_1": [10, 15, 30, 50], "Value_2": [20, 25, 40, 60] }) # 核心转换逻辑 pivoted_df = df.pivot(index="Id", columns="Type", values=["Value_1", "Value_2"]) # 合并多层列名为你需要的「Value字段+Type取值」格式 pivoted_df.columns = [f"{val_col}_{type_val}" for val_col, type_val in pivoted_df.columns] # 重置索引将Id恢复为普通列 pivoted_df = pivoted_df.reset_index()
如果你的数据存在同一个Id+Type组合对应多行的情况,可将pivot替换为pivot_table,新增aggfunc参数指定聚合规则,例如aggfunc="first"取首行值、aggfunc="sum"求和等。
PySpark 实现
使用groupBy+pivot组合实现,缺失值会自动填充为null:
from pyspark.sql import SparkSession from pyspark.sql.functions import first # 示例SparkSession初始化和数据构造(实际使用时替换为你自己的df) spark = SparkSession.builder.appName("pivot_demo").getOrCreate() data = [(1, "A", 10, 20), (1, "B", 15, 25), (2, "A", 30, 40), (3, "C", 50, 60)] df = spark.createDataFrame(data, schema=["Id", "Type", "Value_1", "Value_2"]) # 核心转换逻辑 pivoted_df = df.groupBy("Id") \ .pivot("Type") \ .agg(first("Value_1").alias("Value_1"), first("Value_2").alias("Value_2")) # 可选:如果需要调整列名格式为「Value字段+Type取值」(默认生成格式为Type_Value1) new_cols = [] for col in pivoted_df.columns: if col == "Id": new_cols.append(col) else: type_val, val_col = col.split("_", 1) new_cols.append(f"{val_col}_{type_val}") pivoted_df = pivoted_df.toDF(*new_cols)
如果需要提升大数量下的pivot性能,可以给pivot方法传入第二个参数指定Type的所有取值列表,避免Spark额外扫描全表统计唯一值。
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

