
本文详解如何将多个结构不一但含公共索引列(如 'header')的 pandas dataframe 高效合并为统一宽表,并填充缺失值,最终导出为可直接在 excel 中做透视分析的标准化格式。
在实际数据分析流程中,常需调用多个函数生成不同维度的汇总报表(如按产品线、区域、时间粒度分别输出),各结果均以 'Header' 作为行标识(如 L1, L5, L7 等),其余列为指标(如 Val1, Val5, Val7)。目标是将这些分散的 DataFrame 纵向对齐、横向拼接,形成一个“全量指标矩阵”——即每个 Header 作为唯一行索引,所有出现过的指标列(Val1–Val9)作为列,缺失位置补 0,从而满足 Excel PivotTable 的标准输入要求。
✅ 正确做法:以 Header 为索引横向拼接(推荐)
核心思路是:统一以 'Header' 列设为行索引 → 沿列方向(axis=1)拼接 → 填充空值 → 重置索引名称。这是最符合业务语义且支持后续 Excel 透视的操作范式:
import pandas as pd
# 示例数据(模拟多函数输出)
data1 = {'Header':['L1','L2','L3'], 'Val1':[100.0,200.0,300.0], 'Val2':[400.0,500.0,600.0], 'Val3':[700.0,800.0,900.0]}
data2 = {'Header':['L5','L6'], 'Val5':[1000.0,1100.0], 'Val6':[1300.0,1400.0]}
data3 = {'Header':['L7','L8','L9','L10'], 'Val7':[1900.0,2000.0,2100.0,2200.0], 'Val8':[2900.0,2300.0,2400.0,2800.0], 'Val9':[3500.0,3600.0,3700.0,3900.0]}
data1_summary = pd.DataFrame(data1)
data2_summary = pd.DataFrame(data2)
data3_summary = pd.DataFrame(data3)
# 合并:设 Header 为索引 → 横向拼接 → 去除索引名 → 缺失值填 0(整型优化)
dfs = [data1_summary, data2_summary, data3_summary]
result_df = (
pd.concat([df.set_index('Header') for df in dfs], axis=1)
.rename_axis(None) # 移除索引名,使 Excel 表头更干净
.fillna(0, downcast='int') # 填 0 并自动转为 int(避免小数点)
)
print(result_df)输出即为题目所求的规范宽表:
Val1 Val2 Val3 Val5 Val6 Val7 Val8 Val9 L1 100 400 700 0 0 0 0 0 L2 200 500 800 0 0 0 0 0 L3 300 600 900 0 0 0 0 0 L5 0 0 0 1000 1300 0 0 0 L6 0 0 0 1100 1400 0 0 0 L7 0 0 0 0 0 1900 2900 3500 L8 0 0 0 0 0 2000 2300 3600 L9 0 0 0 0 0 2100 2400 3700 L10 0 0 0 0 0 2200 2800 3900
? 导出至 Excel(含多 Sheet 支持)
使用 pd.ExcelWriter 可轻松导出为 .xlsx,并支持添加多个工作表(如原始分表 + 合并宽表):
with pd.ExcelWriter("pivot_ready_output.xlsx", engine="openpyxl") as writer:
# 写入合并后的宽表(用于 Excel 透视)
result_df.to_excel(writer, sheet_name="Pivot_Source")
# (可选)写入原始分表便于核对
data1_summary.to_excel(writer, sheet_name="Source_1", index=False)
data2_summary.to_excel(writer, sheet_name="Source_2", index=False)
data3_summary.to_excel(writer, sheet_name="Source_3", index=False)
print("✅ 已导出至 pivot_ready_output.xlsx —— 可直接在 Excel 中插入数据透视表!")? Excel 使用提示:打开文件后,选中 Pivot_Source 表的任意单元格 → 【插入】→【数据透视表】→ 默认即可按行/列/值自由拖拽分析。
⚠️ 注意事项与进阶场景
-
Header 重复?用 groupby().sum() 聚合
若不同函数可能输出相同 Header(如 L1 在 data1 和 data2 中都存在),应聚合而非覆盖:result_df = ( pd.concat([df.set_index('Header') for df in dfs], axis=1) .groupby('Header', sort=False).sum() # 自动对齐同名 Header 并求和 .fillna(0, downcast='int') ) 避免 set_axis(range(...)) 等错误方式
网上部分方案通过重命名列为数字索引(如 0, 1, 2)再拼接,会丢失语义列名(Val1, Val5),导致无法识别指标含义,不可用于透视分析。性能优化:若 DataFrame 极大,建议使用 pd.concat(..., ignore_index=False) 并确保 Header 列类型一致(推荐 str),避免隐式转换开销。
掌握此模式后,无论函数产出多少个异构报表,只需统一 set_index('Header') + concat(axis=1) + fillna(0) 三步,即可生成 Excel 友好、透视就绪的标准数据源。










