Pandas在两个数据帧之间执行SQL减法

时间:2013-11-18 22:56:17

标签: python sql pandas

我有两个数据帧。首先是DF1:

ID      Other value
1           a
2           b
3           c

然后有DF2,它是DF1的一个子集:

ID      Other value
1           a

我想创建第三个数据帧,它相当于SQL中的减号:删除两个数据帧交集中的所有观察值。这将留给我DF3:

ID      Other value
2           b
3           c

我一直在尝试使用pandasql,但它似乎不喜欢我的sql。代码如下:     来自pandasql import *     将pandas导入为pd

pysqldf = lambda q: sqldf(q, globals())
train = pysqldf(""" SELECT * FROM DF1 WHERE ID 
                           NOT IN (SELECT ID FROM DF2) """)

我收到错误

Error on sql  SELECT * FROM DF1 WHERE ID 
                           NOT IN (SELECT ID FROM DF2) 

关于出了什么问题或者如何使用其他一些pandas功能快速实现这一点的任何想法。我可以在R中做同样的事情而没有任何问题。

2 个答案:

答案 0 :(得分:5)

这应该这样做

df1[df1.ID.isin(df2.ID) == False]

答案 1 :(得分:1)

您可以减去索引(设置为减号):

In [11]: df1
Out[11]: 
   Other value
ID            
1            a
2            b
3            c

In [12]: df2
Out[12]: 
   Other value
ID            
1            a

In [13]: df1.index - df2.index
Out[13]: Int64Index([2, 3], dtype=int64)

In [14]: df1.loc[df1.index - df2.index]  # assuming IDs are unique
Out[14]: 
   Other value
ID            
2            b
3            c

0.13中的另一个选项是使用isin方法:

In [21]: df1.isin(df2)
Out[21]: 
   Other value
ID            
1         True
2        False
3        False

In [22]: df1[~df1.isin(df2).all(1)]
Out[22]: 
   Other value
ID            
2            b
3            c