我有两个数据帧。首先是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中做同样的事情而没有任何问题。
答案 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