Python Pandas - 查找两个数据帧之间的差异

新手上路,请多包涵

我有两个数据框 df1 和 df2,其中 df2 是 df1 的子集。如何获得一个新的数据框(df3),这是两个数据框之间的区别?

换句话说,一个数据框包含 df1 中所有不在 df2 中的行/列?

在此处输入图像描述

原文由 userPyGeo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 765
2 个回答

通过使用 drop_duplicates

 pd.concat([df1,df2]).drop_duplicates(keep=False)


Update :

The above method only works for those data frames that don't already have duplicates themselves. For example:

 df1=pd.DataFrame({'A':[1,2,3,3],'B':[2,3,4,4]})
df2=pd.DataFrame({'A':[1],'B':[2]})

它会像下面这样输出,这是错误的

错误输出:

 pd.concat([df1, df2]).drop_duplicates(keep=False)
Out[655]:
   A  B
1  2  3

正确输出

Out[656]:
   A  B
1  2  3
2  3  4
3  3  4


如何做到这一点?

方法1:使用 isintuple

 df1[~df1.apply(tuple,1).isin(df2.apply(tuple,1))]
Out[657]:
   A  B
1  2  3
2  3  4
3  3  4

方法二: mergeindicator

 df1.merge(df2,indicator = True, how='left').loc[lambda x : x['_merge']!='both']
Out[421]:
   A  B     _merge
1  2  3  left_only
2  3  4  left_only
3  3  4  left_only

原文由 BENY 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于行,试试这个,其中 Name 是联合索引列(可以是多个公共列的列表,或者指定 left_onright_on ):

 m = df1.merge(df2, on='Name', how='outer', suffixes=['', '_'], indicator=True)

The indicator=True setting is useful as it adds a column called _merge , with all changes between df1 and df2 , categorized into 3 possible kinds :“left_only”、“right_only”或“both”。

对于列,试试这个:

 set(df1.columns).symmetric_difference(df2.columns)

原文由 jpp 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题