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

如何仅合并两个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:46:20