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

Python中如何找出两个结构不同的DataFrame之间的差异?

解决不同索引/列的DataFrame差异对比问题

当两个DataFrame的索引、列不完全一致时,compare()方法确实无法直接使用——它要求两者结构完全匹配。下面给你两种实用的方法来找出双方独有的内容:

方法一:用merge结合indicator参数(推荐)

这个方法能清晰区分出仅在第一个DataFrame(左表)或仅在第二个DataFrame(右表)中存在的行,同时保留所有列(缺失值用NaN填充)。

示例代码

import pandas as pd

# 构造两个结构不同的示例DataFrame
df1 = pd.DataFrame({
    'A': [1, 2, 3],
    'B': ['x', 'y', 'z']
}, index=[0, 1, 2])

df2 = pd.DataFrame({
    'A': [2, 3, 4],
    'C': ['p', 'q', 'r']
}, index=[1, 2, 3])

# 外连接合并两个DataFrame,添加_merge列标记行的来源
merged_df = pd.merge(df1, df2, how='outer', indicator=True)

# 筛选仅在df1中存在的行
only_in_df1 = merged_df[merged_df['_merge'] == 'left_only'].drop('_merge', axis=1)

# 筛选仅在df2中存在的行
only_in_df2 = merged_df[merged_df['_merge'] == 'right_only'].drop('_merge', axis=1)

原理说明

  • how='outer'会保留两个DataFrame的所有行,不存在的列自动填充NaN;
  • indicator=True生成的_merge列会标记每行的来源:left_only(仅df1)、right_only(仅df2)、both(两边都有);
  • 最后通过过滤_merge列并删除该列,就能得到各自独有的内容。

方法二:用concat结合duplicated找不重复行

如果需要以“行内容是否完全重复”为标准找独有内容,可以用这个方法:

示例代码

import pandas as pd

# 给每个DataFrame添加来源标记,方便后续区分
df1_marked = df1.assign(source='df1')
df2_marked = df2.assign(source='df2')

# 合并两个标记后的DataFrame
combined_df = pd.concat([df1_marked, df2_marked])

# 找出重复的行(忽略source列,keep=False标记所有重复行)
duplicate_rows = combined_df.duplicated(subset=combined_df.columns.difference(['source']), keep=False)

# 筛选出不重复的行(即双方独有的内容)
unique_rows = combined_df[~duplicate_rows]

# 拆分回各自的独有内容
only_in_df1 = unique_rows[unique_rows['source'] == 'df1'].drop('source', axis=1)
only_in_df2 = unique_rows[unique_rows['source'] == 'df2'].drop('source', axis=1)

额外:找列的差异

如果需要查看两个DataFrame独有的列,可以直接用列名的差集:

# df1独有的列
df1_unique_cols = df1.columns.difference(df2.columns)
# df2独有的列
df2_unique_cols = df2.columns.difference(df1.columns)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:05:11