如何实现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
相关产品推荐
相关产品推荐

