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
相关产品推荐
相关产品推荐

