|
|
51CTO旗下网站
|
|
移动端

SQL和Python的集合操作对比:适合的就是最好的!

对于分析师或数据科学家而言,熟悉多种分析编程语言可以在当今数据环境中赢得优势。在多语言法的主流对话中,尤其是SQL语言和Python语言,通常被描述为功能性离散。

作者:读芯术来源:今日头条|2019-06-05 08:53

对于分析师或数据科学家而言,熟悉多种分析编程语言可以在当今数据环境中赢得优势。在多语言法的主流对话中,尤其是SQL语言和Python语言,通常被描述为功能性离散。

SQL和Python都可以实现许多功能。探索两种编程语言重叠的功能可以帮助只熟悉一种编程语言的人更加熟悉另一种编程语言。组合和利用每种编程语言,可以对其做出更明智的决策,并更好地为每个任务选择合适的工具。了解如何在SQL或Python中完成任务将帮助你选择出最佳的工作工具。

集合操作

分析式问题通常需要检查多个不同的数据集。在解答过程中,通过比较或组合不同的数据集来创建一组新数据集,非常有效。

例如,你可能有两个单独的表,其中包含要转换为单个事务表的事务性数据,你想把它们合并为一个表,或者创建一个同时包含两个表中数据的新事务表。

在SQL中,集合操作符可以解决这个问题。集合操作符支持对比性操作,可以有条件地连结两个SQL语句的结果集。SQL集合操作符包括:

  • UNION:从待比较的两个查询语句返回结果行。在默认情况下,如果两个SQL语句的结果集中存在相同的行,则UNION不会返回重复行。如果你想返回重复行,可以向集合操作符UNION提供可选ALL关键字。
  • INTERSECT:返回位于两个待比较的查询语句结果集中的行。
  • EXCEPT(或者MINUS):返回到非待比较的查询语句结果集中的行。

虽然Python中没有特定的集合操作符种类,但Python中仍然有各种各样的函数可以实现这些功能。

为了说明如何在实践中使用这些集合操作,先假设你作为一名双边市场数据科学家。在你的市场中有买家和卖家,二者并不相互排斥。现在,买卖双方分别存在于buyers和sellers表格的数据库中。让我们来浏览一下集合操作可能发挥作用的几种场景。

合并和合并所有

假设你想把存在于buyers和sellers表格中的所有用户合并到一个新的单独的“用户”表格中。

在SQL中,你可以使用UNION操作符和可选ALL关键字来实现:

  1. -- SQL
  2. select user_id  
  3. from modeanalytics.buyers  
  4. union all  
  5. select user_id  
  6. from modeanalytics.sellers 

在Python中,可以使用pandas .concat()函数复制上面执行的UNION ALL集合操作。

pandas .concat()方法沿着选定的轴连接pandas对象(例如Dataframes,Series等)。假设您已将buyers和sellers数据库表格中user_id字段存储在两个pandas数据框对象中(buyers 和 sellers),你可以使用以下Python代码复制上面执行过的UNION ALL集合操作:

  1. # Python 
  2. users = pd.concat([buyers, sellers]) 

需要注意的是,在SQL中使用UNION和ALL关键字,或者在Python中使用pandas concat()方法,你将把存在于两个表格中的用户(用户即是买家又是卖家)返回到重复行。但是,如果你只想返回存在于两个表中的一个用户的单一实例时:

在SQL中,从UNION集合操作符中移除ALL关键字:

  1. -- SQL
  2. select user_id  
  3. from modeanalytics.buyers  
  4. union  
  5. select user_id  
  6. from modeanalytics.sellers 

在Python中,将.drop_duplicates()方法链接在连接pandas对象上:

  1. # Python 
  2. users = pd.concat([buyers, sellers]).drop_duplicates() 

交集

反之,如果你想创建一个既是买家又是卖家的独立用户表格呢?

在SQL中,你可以使用INTERSECT集合操作符:

  1. -- SQL
  2. select user_id  
  3. from modeanalytics.buyers  
  4. intersect  
  5. select user_id  
  6. from modeanalytics.sellers 

在Python中,你可以在数据框中使用pandas .merge()方法:

  1. Python 
  2. buyers_and_sellers = buyers.merge(sellers) 

默认情况下,pandas .merge()方法将尝试将两个数据框中的所有列进行“内部”合并。此默认操作基本复制了SQL集合操作符INTERSECT的步骤。

差集

现在,如果你想返回到所有买家用户,而不是卖家用户。

在SQL中,你可以使用EXCEPT集合操作:

  1. -- SQL 
  2. select user_id 
  3. from modeanalytics.buyers 
  4. except 
  5. select user_id 
  6. from modeanalytics.sellers 

值得注意的是,SQL的EXCEPT集合操作符只能返回到第一个表格,不能返回到第二个表格。如果你想要返回到卖方的表格中,你需要颠倒SELECT语句的顺序:

  1. -- SQL 
  2. select user_id 
  3. from modeanalytics.sellers 
  4. except 
  5. select user_id 
  6. from modeanalytics.buyers 

在Python中,利用pandas布尔索引技术和pandas .isin() 索引来复制SQL EXCEPT集合操作符的功能:

  1. # Python  
  2. buyers_not_sellers = buyers[buyers.user_id.isin(sellers.user_id) == False 
  3. sellers_not_buyers = sellers[sellers.user_id.isin(buyers.user_id) == False]` 

模糊界限

到这里,你已经了解了如何在Python中复制大量SQL集合操作符的功能。最终,编程模式的选择取决于你,甚至可以在项目基础上逐个改动。只有通过掌握分析语言功能上的重叠,才能有效做出决策。这就是使用多种数据分析语言的好处:你可以自定义一个混合方法来满足你不断发展的需求。

【编辑推荐】

  1. 6月数据库排行:PostgreSQL 和 MongoDB 分数罕见下降
  2. MySQL导致CPU消耗过大,如何优化
  3. 10个简单步骤,完全理解SQL
  4. MySQL索引原理与应用:索引类型,存储结构与锁
  5. Python+SQL无敌组合,值得你Pick
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+澳门新濠天地平台

Spring Boot 爬虫搜索轻松游

Spring Boot 爬虫搜索轻松游

全栈式开发之旅
共4章 | 美码师

75人订阅学习

Linux性能调优攻略

Linux性能调优攻略

性能调优规范
共15章 | 南非蚂蚁

206人订阅学习

VMware vSphere虚拟化常见故障

VMware vSphere虚拟化常见故障

搞定vSphere虚拟化
共18章 | 王春海

84人订阅学习

读 书 +澳门新濠天地平台

主流ARM嵌入式系统设计技术与实例精解

本书重点介绍了主流ARM应用系统的开发与实践。全书基于目前较为通用、流行的ARM处理器,介绍了其原理、硬件结构、硬件电路设计与开发和软件...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客

博聚网