在1 部分中, 我研究了数据环境的编写信息, 这是 HR 数据的样本, 然后通过比较熊猫库和 SQL 来对数据做一些简单的查询。对于本文中的示例, 我们首先 meed 1 部分所述设置环境。

在这里, 我将继续通过重写与熊猫的查询来提供更复杂的 SQL 查询。SQL 查询有6部分, 即;

  1. 选择: 用于选择所有列或选定列。
  2. 自: 用于包含所需的数据集。
  3. WHERE: 用于定义数据集之间的联接或筛选数据 (在某些语法中, 联接是在 from 子句中定义的, 其中联接关键字如内部联接、外部联接等)。
  4. 分组使用: 用于聚合属性列以计算聚合的度量。
  5. 有: 用于筛选聚合的度量值。
  6. 排序依据: 用于定义所需列的排序。
SELECT <column or columns> /*[1]*/
FROM <table or tables> /*[2]*/
WHERE <join> or <filters> /*[3]*/
GROUP BY <aggregate column or columns> /*[4]*/
HAVING BY <aggregate column filter> /*[5]*/
ORDER BY <sort column or columns> /*[6]*/

在本文中, 程序示例将介绍如何筛选数据。

按值筛选

SQL 版本

SELECT * FROM EMPLOYEES
WHERE MANAGER_ID = 100
AND DEPARTMENT_ID = 90

输出为:

FilterByValueSQL

熊猫版

它可以用四种不同的语法编写, 如下所示, 它们都提供相同的输出数据;

employees_filtered_v1 = employees[(employees.MANAGER_ID == 100) & (employees.DEPARTMENT_ID == 90)]
employees_filtered_v1
#Or
employees_filtered_v2 = employees.query('MANAGER_ID == 100 & DEPARTMENT_ID == 90')
employees_filtered_v2
#Or
employees_filtered_v3 = employees[(employees['MANAGER_ID'] == 100) & (employees['DEPARTMENT_ID'] == 90)]
employees_filtered_v3
#Or
#Using Boolean values
manager_id = employees['MANAGER_ID'] == 100
department_id = employees['DEPARTMENT_ID'] == 90
employees_filtered_v4 = employees[manager_id & department_id]
employees_filtered_v4

下面显示的输出与我们在 SQL 代码段中得到的结果相同。

FilterByValuePandasOutput

在上面的示例中, “and” 运算符用于筛选与这两个条件匹配的数据。但是, 如果要在 SQL 查询和熊猫脚本中使用 “or” 运算符, 请分别使用 “or” 和 ” | ” (管道)。

筛选 null 和非 null 值

SQL 版本

SELECT * FROM EMPLOYEES
WHERE COMMISSION_PCT IS NULL

“雇员” 表的结果为72个记录。

Image title

熊猫版

employees[employees.COMMISSION_PCT.isnull()].count()[1]

Image title

SQL 版本

SELECT * FROM EMPLOYEES
WHERE COMMISSION_PCT IS NOT NULL

“雇员” 表的结果为35条记录cheeli/wp-内容/上传/2018/10/10372334-countnotnullsql. png 宽度 = “236”/>

熊猫版

employees[employees.COMMISSION_PCT.notnull()].count()[1]

此代码的结果为:

Image title

联接两个数据集

有时需要加入两个数据集。可以联接具有不同联接类型的数据集。SQL 中有四种不同类型的联接, 它可应用于具有相同逻辑的熊猫数据帧。这些是:

  1. 内部联接
  2. 左/右联接
  3. 完全外部联接

下面的示例是内部联接示例。在我们的熊猫版本中, 您可以通过设置合并函数的参数来更改联接类型。

1. 左外联接:

how='left'

2. 右外联接

how='right'

3. 完全外部联接

how='outer'

SQL 版本

SELECT 
    e.employee_id, e.department_id,
    e.first_name, e.last_name, 
    d.DEPARTMENT_NAME 
FROM 
    employees e,
    departments d
WHERE e.department_id = d.department_id
order by department_name, first_name , last_name

输出为:

Image title

熊猫版

employees_departments = pd.merge(
    employees[['EMPLOYEE_ID', 'FIRST_NAME', 'LAST_NAME', 'DEPARTMENT_ID']],
    departments[['DEPARTMENT_ID', 'DEPARTMENT_NAME']],
    on = 'DEPARTMENT_ID')
employees_departments

输出为:

Image title

本文介绍了联接和筛选。

Comments are closed.