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

使用Python处理大数据时高效实现长表转宽表的方法咨询

高效长表转宽表实现方案

单节点可容纳的数据集(GB级以内)

直接使用pandas内置的pivot/pivot_table方法,底层为C实现的聚合逻辑,相比手动复制合并的方式,运算效率提升10~100倍,内存占用也大幅降低。
示例代码:

import pandas as pd

# 读取原始数据
# df = pd.read_csv("你的数据集路径")
# 以下为示例测试数据
df = pd.DataFrame({
    "Animal": [1,1,1,2],
    "Day": [1,1,2,2],
    "Food": [17,22,17,15],
    "kg": [0.1,0.7,0.8,0.1]
})

# 执行透视转换
wide_df = df.pivot(
    index=["Animal", "Food"],
    columns="Day",
    values="kg"
).reset_index()

# 格式化列名
wide_df.columns = ["Animal", "Food"] + [f"Day{col}" for col in wide_df.columns[2:]]

超大体量数据集(TB级/单节点内存放不下)

使用分布式计算框架PySpark的pivot算子实现,分布式并行计算不受单节点资源限制。
示例代码:

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("wide_convert").getOrCreate()
# 读取原始数据
df = spark.read.csv("你的数据集路径", header=True, inferSchema=True)

# 执行透视转换
wide_df = df.groupBy("Animal", "Food") \
            .pivot("Day") \
            .agg({"kg": "first"}) \
            .orderBy("Animal", "Food")

# 格式化列名
for old_col in wide_df.columns:
    if old_col not in ["Animal", "Food"]:
        wide_df = wide_df.withColumnRenamed(old_col, f"Day{old_col}")

优化建议

  • 计算前提前过滤无效数据、删除不需要的字段,减少参与计算的数据量
  • 若提前知道要展开的Day的所有取值,可以直接传入给pivot的参数,避免框架扫描全表统计取值,进一步提升计算效率:
    • pandas写法:pd.pivot(..., columns=[1,2,3,4])
    • Spark写法:.pivot("Day", [1,2,3,4])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:45:06