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

如何高效将4个Pandas DataFrame合并至原始DataFrame?

高效实现DataFrame列更新的方案

嘿,这个需求我太熟悉了!完全可以用单条链式语句搞定,根本不需要分4次操作,而且效率比分步处理更高。下面给你详细拆解最优实现方式:

核心思路

我们先把df1-df4中仅保留关联列(TD、PD)和对应要更新的CC列,然后通过链式左合并到原始df上,最后用新合并进来的列值覆盖原df的同名列(仅替换匹配到TD+PD组合的行,未匹配到的保留原df的数值)。

单条语句实现代码

import pandas as pd

final_df = (
    # 从原始df开始
    df
    # 依次合并df1-df4,只保留必要列,先去重避免重复行
    .merge(df1[['TD', 'PD', 'CC1']].drop_duplicates(subset=['TD', 'PD']), 
           on=['TD', 'PD'], how='left', suffixes=['', '_1'])
    .merge(df2[['TD', 'PD', 'CC2']].drop_duplicates(subset=['TD', 'PD']), 
           on=['TD', 'PD'], how='left', suffixes=['', '_2'])
    .merge(df3[['TD', 'PD', 'CC3']].drop_duplicates(subset=['TD', 'PD']), 
           on=['TD', 'PD'], how='left', suffixes=['', '_3'])
    .merge(df4[['TD', 'PD', 'CC4']].drop_duplicates(subset=['TD', 'PD']), 
           on=['TD', 'PD'], how='left', suffixes=['', '_4'])
    # 用新合并的列更新原列,未匹配到的保留原值
    .assign(
        CC1=lambda x: x['CC1_1'].combine_first(x['CC1']),
        CC2=lambda x: x['CC2_2'].combine_first(x['CC2']),
        CC3=lambda x: x['CC3_3'].combine_first(x['CC3']),
        CC4=lambda x: x['CC4_4'].combine_first(x['CC4'])
    )
    # 清理临时生成的后缀列
    .drop(columns=['CC1_1', 'CC2_2', 'CC3_3', 'CC4_4'])
)

关键细节说明

  • drop_duplicates:如果df1-df4中存在同一TD+PD组合的多行数据,必须先去重,否则合并后会导致final_df出现重复行。
  • how='left':确保原始df的所有行都被保留,不会因为df1-df4中没有匹配的TD+PD而丢失数据。
  • combine_first:优先使用df1-df4中的数值更新原列,未匹配到的行自动保留原df的CC列值,完美贴合你的更新需求。
  • 链式操作:整个流程用括号包裹成单条语句,避免创建多余的中间DataFrame,既简洁又高效。

为什么比分4次操作更好?

分步操作需要多次对df进行修改和赋值,会产生更多中间对象,而链式合并是一次性完成所有关联匹配,pandas内部会优化执行效率,代码的可读性和维护性也更强。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 22:17:30