
本文介绍如何在 Pandas 中合并多个结构不一致的 DataFrame 时,自动保留预定义的全部列(如 USD/EUR/GBP),对缺失列填充 NaN,避免因列名不全导致数据丢失。核心方法是使用 pd.merge(..., how='outer') 配合空基底 DataFrame。
本文介绍如何在 pandas 中合并多个结构不一致的 dataframe 时,自动保留预定义的全部列(如 usd/eur/gbp),对缺失列填充 nan,避免因列名不全导致数据丢失。核心方法是使用 `pd.merge(..., how='outer')` 配合空基底 dataframe。
在实际数据分析中,我们常需将主表(含固定结构)与多个来源各异的指标表进行整合。例如,你已定义一个标准模板 DataFrame,包含 group、USD、EUR、GBP 四列(初始值全为 None 或 NaN),但每次接入的业务数据表可能只提供其中部分货币列(如仅有 USD 和 EUR),且行索引(group)完全对齐。此时若直接使用 pd.concat 或常规 merge,容易因列缺失导致结果结构不稳定,甚至丢失预期字段。
正确做法是构建一个“列骨架”基底 DataFrame,并始终以它为左表执行外连接(how='outer')。该策略确保:
✅ 所有预设列(USD/EUR/GBP)恒定存在于最终结果;
✅ 源数据中未出现的列自动填充 NaN;
✅ 已存在的列值被准确映射到对应 group 行;
✅ 不依赖 group 列是否显式存在——即使源表无 group,也可通过 left_index=True, right_index=True 对齐。
以下为可复用的实现代码:
import pandas as pd
import numpy as np
# 步骤1:定义标准列结构(基底DataFrame)
base_df = pd.DataFrame({
'group': ['A', 'B', 'C'],
'USD': [np.nan, np.nan, np.nan],
'EUR': [np.nan, np.nan, np.nan],
'GBP': [np.nan, np.nan, np.nan]
})
# 步骤2:模拟不同结构的源数据(均含group列)
df_data1 = pd.DataFrame({
'group': ['A', 'B', 'C'],
'USD': [np.nan, 0.04, 0.02],
'EUR': [0.05, np.nan, np.nan],
'GBP': [0.04, 0.03, 0.01]
})
df_data2 = pd.DataFrame({
'group': ['A', 'B', 'C'],
'USD': [np.nan, 0.04, 0.02],
'GBP': [0.04, 0.03, 0.01]
})
df_data3 = pd.DataFrame({
'group': ['A', 'B', 'C'],
'EUR': [0.05, np.nan, np.nan],
'GBP': [0.04, 0.03, 0.01]
})
# 步骤3:统一使用 outer merge 补全列(以 base_df 为左表)
result1 = base_df.merge(df_data1, on='group', how='outer')
result2 = base_df.merge(df_data2, on='group', how='outer')
result3 = base_df.merge(df_data3, on='group', how='outer')
print("完整三列数据合并结果:")
print(result1)
print("\n仅含 USD & GBP 的合并结果:")
print(result2)输出示例:
完整三列数据合并结果: group USD EUR GBP 0 A NaN 0.05 0.04 1 B 0.04 NaN 0.03 2 C 0.02 NaN 0.01 仅含 USD & GBP 的合并结果: group USD EUR GBP 0 A NaN NaN 0.04 1 B 0.04 NaN 0.03 2 C 0.02 NaN 0.01
⚠️ 关键注意事项:
- base_df 必须包含所有目标列(包括 group),否则 merge 无法识别缺失列;
- 若源数据不含 group 列,但行顺序严格对应,可改用 left_index=True, right_index=True 并设置 base_df.set_index('group');
- how='outer' 是关键——'left' 会丢弃右表新增列,'inner' 则过滤掉无匹配行,均不符合需求;
- 如需批量处理多个数据表,可封装为函数:
def fill_columns(base, data_df, on='group'): return base.merge(data_df, on=on, how='outer')
此方法简洁、健壮且符合 Pandas 最佳实践,适用于 ETL 流程中多源异构指标的标准化整合场景。










