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

