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
相关产品推荐
相关产品推荐

