如何仅合并两个DataFrame的非公共行与列得到目标结果?
合并两个DataFrame的非公共行与列的最优实现方法
核心思路
只保留两个DataFrame中仅在自身存在的行和仅在自身存在的列,再将这两部分合并,缺失值自动用NaN填充。
具体实现代码
假设你的DataFrame使用索引来标识行(若用主键列,见补充说明):
1. 识别非公共行与列
通过pandas的集合运算快速定位独有的行和列:
import pandas as pd # 获取仅在df1/df2中存在的列 df1_unique_cols = df1.columns.difference(df2.columns) df2_unique_cols = df2.columns.difference(df1.columns) # 获取仅在df1/df2中存在的行(基于索引) df1_unique_rows = df1.index.difference(df2.index) df2_unique_rows = df2.index.difference(df1.index)
2. 提取目标子集
从原DataFrame中筛选出仅包含非公共行和列的部分:
df1_target = df1.loc[df1_unique_rows, df1_unique_cols] df2_target = df2.loc[df2_unique_rows, df2_unique_cols]
3. 合并得到结果
用pd.concat合并两个子集,自动对齐行和列:
df_merged = pd.concat([df1_target, df2_target], axis=0, join='outer')
补充:基于主键列而非索引的场景
如果你的行是通过某一列(比如id)来唯一标识的,只需调整行的筛选逻辑:
# 假设主键列为'id' common_ids = df1['id'].intersection(df2['id']) df1_unique_ids = df1['id'].difference(df2['id']) df2_unique_ids = df2['id'].difference(df1['id']) # 筛选子集 df1_target = df1[df1['id'].isin(df1_unique_ids)][df1_unique_cols] df2_target = df2[df2['id'].isin(df2_unique_ids)][df2_unique_cols] # 合并并重置索引 df_merged = pd.concat([df1_target, df2_target], axis=0, join='outer').reset_index(drop=True)
方法优势
- 利用pandas原生的集合运算方法,效率远高于循环或逐行判断;
- 逻辑清晰,代码简洁易维护;
- 自动处理缺失值,无需额外填充逻辑。
内容的提问来源于stack exchange,提问作者python_beginner
相关产品推荐
相关产品推荐

