首页 > 解决方案 > 比较两个数据帧并在 Python 中查找每个数据帧中缺少的内容

问题描述

我有两个具有完全相同数据结构的数据帧。我需要比较它们以查看它们是否由于任何列值不同而导致记录有任何差异。

我正在使用下面的代码来执行此操作,它可以完美地报告这两个数据帧之间是否绑定或解绑。

df=pd.concat([df1, df2])
df = df.reset_index(drop=True)
df_gpby = df.groupby(list(df.columns))
idx = [x[0] for x in df_gpby.groups.values() if len(x) == 1]
if df.reindex(idx).empty:
    print('everything is good.')
else:
    print('things do not tie out')
    df.reindex(idx).to_csv('diff.csv', index=False)
    

虽然diff.csv告诉我所有缺失或不同之处,但它没有告诉我的是哪个记录最初属于哪个数据帧,以及给定记录的初始数据帧之间的哪些列值不同。有没有办法以某种方式在我的最终输出中获取这些信息?

示例数据框。

   Name | Age| Gender
0| Naxi | 27 | Male
1| Karan| 25 | Male
2| Tanya| 27 | Female


   Name | Age| Gender
0| Naxi | 27 | Male
1| Tanya| 27 | Female
2| Karan| 24 | Male

我想要的输出

   Name | Age| Gender | Dataframe
   Karan| 24 | Male   | df2
   Karan| 25 | Male   | df1

标签: pythonpandas

解决方案


您可以向每个数据框添加 1 列,然后在删除重复项时忽略该列(在 pd.concat 之后)。

df1['Dataframe'] = 'df1'
df2['Dataframe'] = 'df2'
df=pd.concat([df1, df2])
diff_df =  df.drop_duplicates(subset=['Name', 'Age', 'Gender'], keep=False)
print(diff_df)

输出 -

    Name  Age Gender Dataframe
2  Karan   24   Male       df1
1  Karan   25   Male       df2

输出中的索引将帮助您在初始数据框中找到正确的行。


推荐阅读