Pandas如何对列部分重叠的DataFrame做外连接并优先取指定DF值
索引重叠、列重叠的DataFrame按索引外连接实现方案
直接用pandas内置的combine_first方法即可实现需求,无需额外编写自定义合并逻辑,该方法默认按索引对齐做外连接,且优先保留调用方的非空值,完全匹配“列重叠时优先取指定DataFrame值、保留两个DF全部行和列”的要求。
核心实现代码
import pandas as pd import numpy as np old_df = pd.DataFrame({'fruit': ['apples', 'apples', 'bananas', 'bananas'], 'entree': ['steak', 'chicken', 'chicken', 'fish'], 'side': ['fries', 'salad', 'salad', 'soup']}, index=[0, 1, 2, 3]) new_df = pd.DataFrame({'entree': ['chicken breast', 'salmon', 'ribeye', 'cheeseburger'], 'side': ['greek salad', 'clam chowder', 'fries', 'fries'], 'desert': ['key lime pie', 'chocolate mousse', 'tiramasu', np.nan]}, index=[2, 3, 4, 5]) # 核心合并逻辑:优先取new_df的重叠列值,缺失位置用old_df填充 merged_df = new_df.combine_first(old_df) # 按期望顺序调整列序,无列序要求可省略 merged_df = merged_df[['fruit', 'entree', 'side', 'desert']]
运行输出结果
执行代码后得到的结果和预期完全一致:
fruit entree side desert 0 apples steak fries NaN 1 apples chicken salad NaN 2 bananas chicken breast greek salad key lime pie 3 bananas salmon clam chowder chocolate mousse 4 NaN ribeye fries tiramasu 5 NaN cheeseburger fries NaN
逻辑说明
- 方法默认对两个DataFrame按索引做全外连接,自动保留所有索引行、所有列,无需额外指定连接参数
- 重叠列、重叠索引位置的取值优先级:优先保留调用方(此处为
new_df)的非空值,仅当调用方该位置为空时,才取传入的old_df对应位置的值 - 如果需要调整优先级,优先取
old_df的重叠值,只需调换调用顺序为old_df.combine_first(new_df)即可 - 非重叠列、非重叠索引位置会自动保留对应DataFrame的原值,不存在的位置默认填充
NaN
内容的提问来源于stack exchange,提问作者eschibli
相关产品推荐
相关产品推荐

