如何高效将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
相关产品推荐
相关产品推荐

