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

如何实现Pandas透视表的读写?解决代码遗忘及处理耗时问题

解决方案:找回Pandas透视表处理流程 + 优化读写提速

我完全懂这种“曾经写过的代码现在死活想不起来”的抓狂感,尤其是涉及到一堆数据合并、重塑的复杂流程。结合你的需求,我整理了一套贴合场景的通用流程模板,再加上能大幅压缩耗时的透视表读写方案,应该能帮你快速回到正轨。

一、重构从数据清洗到透视表的完整流程

先给你一个贴近你操作场景的代码框架,你可以根据自己的数据集细节调整:

1. 批量读取原始数据集

import pandas as pd
import numpy as np

# 假设你有多个结构化数据集(比如CSV/Excel),先批量读取
file_list = ["dataset1.csv", "dataset2.xlsx", "dataset3.csv"]
dfs = []
for file in file_list:
    if file.endswith(".csv"):
        dfs.append(pd.read_csv(file))
    elif file.endswith(".xlsx"):
        dfs.append(pd.read_excel(file))

2. 数据清洗示例(按需调整)

# 统一列名、处理缺失值、筛选核心字段等
for idx, df in enumerate(dfs):
    # 统一关键列名称(避免合并时列名不一致)
    dfs[idx] = df.rename(columns={"原始主键列": "common_key", "原始分类列": "category"})
    # 处理缺失值(根据业务逻辑选删除/填充)
    dfs[idx] = df.dropna(subset=["common_key", "target_value"])
    # 只保留后续需要的字段,减少计算量
    dfs[idx] = df[["common_key", "category", "target_value", "metric_type"]]

3. 合并/拼接数据集

根据你的数据关系选择merge(按主键关联)或concat(纵向拼接):

# 按共同主键合并多表(比如outer保留所有数据)
merged_df = dfs[0]
for df in dfs[1:]:
    merged_df = pd.merge(merged_df, df, on="common_key", how="outer")

# 如果是结构完全一致的数据集,直接纵向拼接
# merged_df = pd.concat(dfs, ignore_index=True)

4. 数据重塑与透视表生成

# 宽表转长表(用melt,按需调整参数)
melted_df = pd.melt(merged_df,
                    id_vars=["common_key", "category"],
                    value_vars=["value_1", "value_2", "value_3"],
                    var_name="metric",
                    value_name="actual_value")

# 生成最终透视表
final_pivot = pd.pivot_table(melted_df,
                             index=["common_key"],
                             columns=["category", "metric"],
                             values=["actual_value"],
                             aggfunc=np.sum,  # 替换成你需要的聚合函数:mean/count等
                             fill_value=0)

二、优化流程:保存/读取透视表大幅提速

既然全流程要5-10分钟,把生成好的透视表保存成高效格式是最优解,不用每次都重复跑完整流程。推荐这两种方案:

1. Parquet格式(首选:高效压缩+跨语言支持)

Parquet是列式存储格式,比CSV快数倍,压缩率极高,还支持跨语言读取:

# 保存透视表
final_pivot.to_parquet("final_pivot_table.parquet")

# 下次直接读取,几秒就能加载完成
final_pivot = pd.read_parquet("final_pivot_table.parquet")

2. Pickle格式(Python专属:完整保留数据结构)

如果不需要跨语言使用,Pickle可以完整保存Pandas对象的所有细节,读写速度也很快:

# 保存透视表
final_pivot.to_pickle("final_pivot_table.pkl")

# 读取透视表
final_pivot = pd.read_pickle("final_pivot_table.pkl")

额外提速小技巧

  • 生成透视表前,先过滤掉不需要的行/列,减少计算量;
  • 聚合函数优先用numpy的实现(比如np.sum),比Pandas自带函数更快;
  • 如果数据集超大,可以尝试用Dask做并行处理,但仅优化读写的话,Parquet基本足够。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:19:57