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

pandas中如何合并可能存在空DataFrame的多个数据框

pandas批量合并含空DataFrame的实现方案

直接用pd.concat出现日期不对齐、重复行的核心原因是:concat默认按行/列位置拼接,不会自动按关联键匹配,且未提前区分每个表的数值列,空表结构也未做适配处理。
以下方案完全适配任意数量表、任意表为空的批量场景:

实现逻辑

  • 统一维护待合并表的映射关系:用字典存储所有待合并DataFrame,字典key为最终结果里对应数值列的列名,value为DataFrame本身
  • 预处理阶段跳过空表的列处理,同时收集所有表中出现过的PeriodEndDate作为合并基准,避免日期遗漏
  • 逐表以PeriodEndDate为键做左连接合并,自动按日期对齐,不会产生重复行
  • 合并完成后补全空表对应的列,将空值填充为目标值(示例为0)

可运行代码

import pandas as pd

# --------------- 示例数据构造 ---------------
A = pd.DataFrame({
    'PeriodEndDate': pd.to_datetime([
        '2021-02-28 23:59:59', '2021-05-31 23:59:59',
        '2021-08-31 23:59:59', '2021-11-30 23:59:59',
        '2022-02-28 23:59:59'
    ]),
    'value': [200, 250, 175, 100, 150]
})

B = pd.DataFrame({
    'PeriodEndDate': pd.to_datetime([
        '2021-02-28 23:59:59', '2021-05-31 23:59:59',
        '2021-08-31 23:59:59', '2021-11-30 23:59:59',
        '2022-02-28 23:59:59'
    ]),
    'value': [99, 50, 40, 50, 40]
})

C = pd.DataFrame(columns=['PeriodEndDate', 'value'])  # 空DataFrame

# 待合并表字典,批量场景下直接往这个字典加元素即可
df_map = {"A": A, "B": B, "C": C}

# --------------- 核心合并函数 ---------------
def merge_multi_df(df_dict, key_col="PeriodEndDate", fill_val=0):
    processed_list = []
    all_date_set = set()

    # 第一轮:预处理非空表,收集全量日期
    for col_name, df in df_dict.items():
        if df.empty:
            continue
        # 将数值列重命名为对应表名
        tmp = df.rename(columns={"value": col_name})
        processed_list.append(tmp)
        all_date_set.update(tmp[key_col].to_list())

    # 所有表均为空时直接返回带标准列结构的空表
    if not processed_list:
        return pd.DataFrame(columns=[key_col] + list(df_dict.keys()))

    # 构建全量日期基准表
    result = pd.DataFrame({key_col: sorted(all_date_set)})
    # 逐表按关联键合并
    for tmp_df in processed_list:
        result = result.merge(tmp_df, on=key_col, how="left")

    # 补全空表对应的列
    for col_name in df_dict.keys():
        if col_name not in result.columns:
            result[col_name] = fill_val

    # 空值填充、重置索引
    return result.fillna(fill_val).reset_index(drop=True)

# 调用函数得到结果
final_df = merge_multi_df(df_map)
print(final_df)

运行输出

PeriodEndDate    A   B  C
0 2021-02-28 23:59:59  200  99  0
1 2021-05-31 23:59:59  250  50  0
2 2021-08-31 23:59:59  175  40  0
3 2021-11-30 23:59:59  100  50  0
4 2022-02-28 23:59:59  150  40  0

适配说明

  • 批量处理时只需要往df_map字典中新增键值对即可,不需要修改合并逻辑
  • 任意数量的表为空都能正常输出,不会出现列缺失、结构错乱问题
  • 不同表的PeriodEndDate不完全一致时,会自动保留所有出现过的日期,缺失值自动填充为设定值
  • 如果不需要填充0,修改fill_val参数或删除fillna逻辑即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 00:36:28