使用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])
- pandas写法:
内容的提问来源于stack exchange,提问作者MatheMarco
相关产品推荐
相关产品推荐

