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

基于唯一主键对高效合并字典中多个DataFrame的方法问询

高效合并多DataFrame的实现方案

核心思路

既然每个p_k值会在至少两个不同的DataFrame中出现,且匹配关系唯一,最直接高效的方式是要么聚合后按p_k分组合并非空值,要么用链式outer merge,两种方式都能避免冗余计算,适配你30个70行DataFrame的场景。

方法一:分组合并(最简高效)

  1. 先统一所有DataFrame的主键列名(如果列名不一致):
import pandas as pd

# 示例:将某DF的主键列名从'primary_key'改为'p_k'
# df_dict['bees'].rename(columns={'primary_key': 'p_k'}, inplace=True)
  1. 合并所有DataFrame到一个大表:
combined_df = pd.concat(df_dict.values(), ignore_index=True)
  1. 按p_k分组,提取每组内各列的第一个非空值完成合并:
merged_result = combined_df.groupby('p_k').agg(
    lambda x: x.dropna().iloc[0] if not x.dropna().empty else None
).reset_index()

这种方式的时间复杂度接近线性,是小数据量下的最优选择。

方法二:链式Outer Merge(逻辑直观)

借助functools.reduce实现一次性链式合并,避免手动循环:

from functools import reduce

# 以第一个DataFrame为基础,依次和其余DF做outer merge
merged_result = reduce(
    lambda left, right: pd.merge(left, right, on='p_k', how='outer'),
    df_dict.values()
)

处理重复列(可选)

如果不同DataFrame有同名非主键列,merge后会生成_x/_y后缀列,可合并为原列名:

# 获取基准列名(取第一个DF的列)
base_cols = list(next(iter(df_dict.values())).columns)
base_cols.remove('p_k')

for col in base_cols:
    if f"{col}_x" in merged_result.columns:
        # 优先保留左侧非空值,右侧补充
        merged_result[col] = merged_result[f"{col}_x"].combine_first(merged_result[f"{col}_y"])
        merged_result.drop([f"{col}_x", f"{col}_y"], axis=1, inplace=True)

性能说明

你的场景总数据量仅2100行(30*70),两种方法的计算开销都可以忽略。如果后续数据量扩大,分组合并的性能优势会更明显。

内容的提问来源于stack exchange,提问作者Sentient AI Turing

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:10:20