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

Pandas多DataFrame合并/连接遇阻,寻求更高效实现方案

高效合并多个DataFrame填充空表的方案

现有DataFrames

我有以下几个DataFrame:

results(空表,需填充值)

print(results)
           values
abc xy num       
a   x  1      NaN
       2      NaN
    y  1      NaN
       2      NaN
b   x  1      NaN
       2      NaN
    y  1      NaN
       2      NaN
c   x  1      NaN
       2      NaN
    y  1      NaN
       2      NaN

计算结果DataFrames

print(calc1)
        values
abc xy
a   x      400
    y      400

print(calc2)
        values
abc xy
b   x      100
    y      100

print(calc3)
        values
abc xy
c   x      800
    y      800

需求目标

希望将calc1、calc2、calc3的结果填充到results中,最终得到如下结果:

values
abc xy num                           
a   x  1      400.0
       2      400.0
    y  1      400.0
       2      400.0
b   x  1      100.0
       2      100.0
    y  1      100.0
       2      100.0
c   x  1      800.0
       2      800.0
    y  1      800.0
       2      800.0

当前低效实现

目前通过多次merge的方式实现,但处理数百个DataFrame时效率极低:

merge1 = results.merge(calc1, how='left', left_index=True, right_index=True)
merge1.drop(['values_x'], axis=1, inplace=True)
merge2 = merge1.merge(calc2, how='left', left_index=True, right_index=True)
merge3 = merge2.merge(calc3, how='left', left_index=True, right_index=True)
stack = pd.DataFrame(merge3.stack(dropna=False))
stack = stack.reset_index(level=3)
print(stack.iloc[:, 1:].dropna())

高效解决方案

由于各calc DataFrame的结果无重叠,且每个(abc, xy)组对应唯一值,可通过以下高效方式实现:

方法1:合并计算结果后批量映射填充

将所有calc DataFrame合并为一个,再利用索引层级匹配将值广播到results的对应行:

# 将所有计算结果DataFrame存入列表
calc_dfs = [calc1, calc2, calc3]

# 合并所有计算结果(无重叠,直接concat即可)
combined_calc = pd.concat(calc_dfs)

# 利用索引层级映射,将(abc, xy)对应的值填充到该组下的所有num行
results['values'] = results.index.get_level_values([0,1]).map(combined_calc['values'])

方法2:循环使用combine_first合并计算结果

如果需要逐步合并计算结果,可使用combine_first避免索引冲突:

calc_dfs = [calc1, calc2, calc3]

# 初始化合并后的计算结果表
combined_calc = pd.DataFrame()
for df in calc_dfs:
    combined_calc = combined_calc.combine_first(df)

# 填充到results
results['values'] = results.index.get_level_values([0,1]).map(combined_calc['values'])

方案优势

  • 避免了多次merge产生的冗余列和后续的stack/reset_index操作,大幅减少计算开销
  • 直接通过索引层级映射实现值的广播,逻辑清晰且效率更高,尤其适合处理数百个DataFrame的场景

内容的提问来源于stack exchange,提问作者fabio-dc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 05:44:57