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)
使用~反转掩码
这是另一个类似于 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 的比较可能是值得的
| 归档时间: |
|
| 查看次数: |
10362 次 |
| 最近记录: |