
本文介绍使用 pandas 的 melt 和 merge 方法,将 gdp、失业率、通胀率等多张宽格式 excel 表合并为统一的长格式数据框,通过外连接保留缺失国家的数据,并彻底规避手动循环拼接导致的重复行问题。
本文介绍使用 pandas 的 melt 和 merge 方法,将 gdp、失业率、通胀率等多张宽格式 excel 表合并为统一的长格式数据框,通过外连接保留缺失国家的数据,并彻底规避手动循环拼接导致的重复行问题。
在处理多源宏观经济数据时(如各国 GDP、失业率、通胀率分年份存储于不同 Excel 表),常见误区是采用逐国遍历 + pd.concat 的“手工拼接”方式——这不仅逻辑复杂、性能低下,更易因索引错位或条件判断疏漏引发重复行爆炸(如示例中阿根廷 GDP 和失业率各行均出现两次)。根本原因在于:原始数据为宽格式(年份为列),而合并操作需在一致的结构化键(Country + Year)上对齐;直接按 Country 分组拼接,却未对齐年份维度,导致同一国家-年份组合被多次复制。
✅ 正确解法是遵循 “统一标准化 → 键对齐合并 → 按需重塑” 三步范式:
1. 将各表转为标准长格式(melt)
假设每张 Excel 表结构均为:Country 列 + 多个年份列(如 '1980', '1981'),需将年份列“融化”为行,使每行唯一标识 (Country, Year):
import pandas as pd
gdp = pd.read_excel("gdp.xlsx")
unemployment = pd.read_excel("unemployment.xlsx")
inflation = pd.read_excel("inflation.xlsx")
# 统一转换为长格式:Country + Year + 指标值
gdp_long = pd.melt(gdp, id_vars=['Country'], var_name='Year', value_name='GDP')
unemployment_long = pd.melt(unemployment, id_vars=['Country'], var_name='Year', value_name='Unemployment Rate')
inflation_long = pd.melt(inflation, id_vars=['Country'], var_name='Year', value_name='Inflation Rate')⚠️ 注意:确保所有表中 Country 列名完全一致(如均为 'Country'),且年份列名类型统一(建议字符串 '1980' 而非整数 1980,避免 merge 时类型不匹配)。
2. 基于 Country 和 Year 外连接合并(merge)
使用 how='outer' 保证任一表中存在的国家-年份组合均被保留,缺失指标自动填充 NaN:
# 先合并 GDP 与失业率 merged = pd.merge(gdp_long, unemployment_long, on=['Country', 'Year'], how='outer') # 再合并通胀率 merged = pd.merge(merged, inflation_long, on=['Country', 'Year'], how='outer') # 查看结果(前几行) print(merged.head()) # Country Year GDP Unemployment Rate Inflation Rate # 0 Argentina 1980 5000.0 6.7 NaN # 1 Argentina 1981 5400.0 6.6 NaN # 2 Albania 1980 4000.0 NaN NaN # 3 Australia 1980 4000.0 4000.0 300.0
3. (可选)按需重塑为宽格式或保留长格式
- 若需最终输出为题目所示的“国家 × 指标 × 年份”宽表(即每个国家下 GDP/失业率/通胀率作为独立行),无需 pivot,当前长格式已满足需求;
-
若需“国家 × 年份”为索引,各指标为列(便于后续分析),可使用 pivot_table:
result_wide = merged.pivot_table( index=['Country', 'Year'], values=['GDP', 'Unemployment Rate', 'Inflation Rate'], aggfunc='first' # 处理潜在重复键(正常情况下无重复) ).reset_index()
✅ 关键优势总结
- 零重复:基于 (Country, Year) 精确对齐,杜绝循环拼接导致的行复制;
- 强鲁棒性:outer 合并天然支持缺失值(如 Albania 无通胀数据);
- 可扩展:新增指标(如利率、贸易额)只需复用 melt + merge 流程;
- 高性能:向量化操作远快于 Python 循环。
? 提示:若原始 Excel 中存在空行、隐藏字符或年份列名含空格,务必在 melt 前用 df.columns.str.strip() 清洗列名,并检查 dtypes(merged['Year'].astype(str) 可强制统一类型)。

















