如何在pandas中执行“(df1 & not df2)”数据框合并操作?

29

我有两个Pandas数据帧df1和df2,它们有相同的列/键(x,y)。

我想在键(x,y)上执行"(df1 & not df2)"合并,这意味着我希望我的代码返回一个仅包含df1中(x,y)存在而df2中不存在的行的数据帧。

SAS具有等效功能。

data final;
merge df1(in=a) df2(in=b);
by x y;
if a & not b;
run;

如何在pandas中优雅地复制相同的功能?如果我们可以在merge()中指定how="left-right",那将是非常好的。

2个回答

41

我刚刚升级到10天前发布的0.17.0 RC1版本。发现在这个新版本中,pd.merge() 函数有一个名为 indicator=True 的新参数,用来以一种更 Pandonic 的方式实现这个功能!!

df=pd.merge(df1,df2,on=['x','y'],how="outer",indicator=True)
df=df[df['_merge']=='left_only']

指示器:在输出的DataFrame中添加一个名为_merge的列,其中包含每行的来源信息。 _merge是分类类型,并且取值为left_only,表示合并键仅出现在“ left” DataFrame中的观测结果;right_only表示合并键仅出现在“右”DataFrame中的观测结果;如果观测到的合并键同时存在于两个数据框中,则_merge的值为both。

http://pandas-docs.github.io/pandas-docs-travis/merging.html#database-style-dataframe-joining-merging


3
正确过滤数据框的方式如下,您需要更正代码的第二行:df = df [df ['_merge'] == 'left_only']。 - Nickpick
感谢指出笔误。我已根据您的评论进行了修正。 - GeorgeOfTheRF
我发现这个链接对于这种和其他情况非常有帮助!https://kanoki.org/2019/07/04/pandas-difference-between-two-dataframes/ - Sn3akyP3t3

1

另一种方法是使用索引。

如果i1i2是索引(索引集),则i1.difference(i2)表示在i1中而不在i2中的那些索引。然后,如果df是由相同索引类型索引的数据帧,例如i1=df.index,那么pd.DataFrame(index=i1.difference(i2)).join(df)是那些索引不在索引i2中的df条目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接