python pandas:如何在一个数据帧中查找行而不在另一个数据帧中查找?

Pyt*_*ous 9 python dataframe pandas

假设我有两个表:people_all并且people_usa都具有相同的结构,因此具有相同的主键.

我怎样才能得到一张不在美国的人的表?在SQL中我会做类似的事情:

select a.*
from people_all a

left outer join people_usa u
on a.id = u.id

where u.id is null
Run Code Online (Sandbox Code Playgroud)

什么是Python等价物?我想不出把这个where语句翻译成pandas语法的方法.

我能想到的唯一方法是向people_usa(例如people_usa['dummy']=1)添加一个任意字段,进行左连接,然后只获取'dummy'为nan的记录,然后删除虚拟字段 - 这看起来有点复杂.

谢谢!

EdC*_*ica 15

使用isin和否定布尔掩码:

people_usa[~people_usa['ID'].isin(people_all ['ID'])]
Run Code Online (Sandbox Code Playgroud)

例:

In [364]:
people_all = pd.DataFrame({ 'ID' : np.arange(5)})
people_usa = pd.DataFrame({ 'ID' : [3,4,6,7,100]})
people_usa[~people_usa['ID'].isin(people_all['ID'])]

Out[364]:
    ID
2    6
3    7
4  100
Run Code Online (Sandbox Code Playgroud)

所以从结果中删除3和4,布尔掩码如下所示:

In [366]:
people_usa['ID'].isin(people_all['ID'])

Out[366]:
0     True
1     True
2    False
3    False
4    False
Name: ID, dtype: bool
Run Code Online (Sandbox Code Playgroud)

使用~反转掩码


Max*_*axU 5

这是另一个类似于 SQL Pandas 的方法:.query()

people_all.query('ID not in @people_usa.ID')
Run Code Online (Sandbox Code Playgroud)

或使用 NumPy 的in1d()方法:

people_all.[~np.in1d(people_all, people_usa)]
Run Code Online (Sandbox Code Playgroud)

注意:对于那些有 SQL 经验的人来说,阅读Pandas 与 SQL 的比较可能是值得的