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

如何以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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 06:57:04