33-Pandas执行SQL操作

Pandas执行SQL操作

我们知道,使用 SQL 语句能够完成对 table 的增删改查操作,Pandas 同样也可以实现 SQL 语句的基本功能。本节主要讲解 Pandas 如何执行 SQL 操作。

首先加载一个某连锁咖啡厅地址分布的数据集,通过该数据集对本节内容进行讲解。

import pandas as pd
df = pd.read_excel("C:\\Users\\qwy\\Desktop\\data\\empdata.xlsx")
print(df)

输出结果如下:

    EMPNO   ENAME        JOB     MGR    HIREDATE   SAL    COMM  DEPTNO
0    7369   SMITH      CLERK  7902.0  1980-12-17   800     NaN      20
1    7499   ALLEN   SALESMAN  7698.0  1981-02-20  1600   300.0      30
2    7521    WARD   SALESMAN  7698.0  1981-02-22  1250   500.0      30
3    7566   JONES    MANAGER  7839.0  1981-04-02  2975     NaN      20
4    7654  MARTIN   SALESMAN  7698.0  1981-09-28  1250  1400.0      30
5    7698   BLAKE    MANAGER  7839.0  1981-05-01  2850     NaN      30
6    7782   CLARK    MANAGER  7839.0  1981-06-09  2450     NaN      10
7    7788   SCOTT    ANALYST  7566.0  1987-04-19  3000     NaN      20
8    7839    KING  PRESIDENT     NaN  1981-11-17  5000     NaN      10
9    7844  TURNER   SALESMAN  7698.0  1981-09-08  1500     0.0      30
10   7876   ADAMS      CLERK  7788.0  1987-05-23  1100     NaN      20
11   7900   JAMES      CLERK  7698.0  1981-12-03   950     NaN      30
12   7902    FORD    ANALYST  7566.0  1981-12-03  3000     NaN      20
13   7934  MILLER      CLERK  7782.0  1982-01-23  1300     NaN      10

SELECT

在 SQL 中,SELECT 查询语句使用,把要查询的每个字段分开,当然您也可以使用*来选择所有的字段。如下所示:

SELECT EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO FROM emp LIMIT 5;

对于 Pandas 而言,要完成 SELECT 查询,需要把数据集每一列(columns)的名称传递给 DataFrame 对象。如下所示:

df[['EMPNO','ENAME','JOB','MGR','HIREDATE','SAL','COMM' , 'DEPTNO']].head(5)

下面代码是 Pandas 执行 SELECT 查询的完整程序:

import pandas as pd
df = pd.read_excel("C:\\Users\\qwy\\Desktop\\data\\empdata.xlsx")
emp = df[['EMPNO','ENAME','JOB','MGR','HIREDATE','SAL','COMM' , 'DEPTNO']].head(5)
print(emp)

输出结果如下:

   EMPNO   ENAME       JOB     MGR    HIREDATE   SAL    COMM  DEPTNO
0   7369   SMITH     CLERK  7902.0  1980-12-17   800     NaN      20
1   7499   ALLEN  SALESMAN  7698.0  1981-02-20  1600   300.0      30
2   7521    WARD  SALESMAN  7698.0  1981-02-22  1250   500.0      30
3   7566   JONES   MANAGER  7839.0  1981-04-02  2975     NaN      20
4   7654  MARTIN  SALESMAN  7698.0  1981-09-28  1250  1400.0      30

假如您传入的是一个空列表, 那最终结果将输出所有的行索引标签。

WHERE

SQL 中的条件查询是通过 WHERE 子句完成的。格式如下所示:

SELECT * FROM EMP WHERE DEPTNO = '30';

然而 DataFrame 可以通过多种方式实现条件筛选,最直观的方法是通过布尔索引:

df[df['DEPTNO'] == 30]

完整程序如下:

import pandas as pd
df = pd.read_excel("C:\\Users\\qwy\\Desktop\\data\\empdata.xlsx")
emp = df[df['DEPTNO'] == 30]
print(emp)

输出结果如下:

    EMPNO   ENAME       JOB     MGR    HIREDATE   SAL    COMM  DEPTNO
1    7499   ALLEN  SALESMAN  7698.0  1981-02-20  1600   300.0      30
2    7521    WARD  SALESMAN  7698.0  1981-02-22  1250   500.0      30
4    7654  MARTIN  SALESMAN  7698.0  1981-09-28  1250  1400.0      30
5    7698   BLAKE   MANAGER  7839.0  1981-05-01  2850     NaN      30
9    7844  TURNER  SALESMAN  7698.0  1981-09-08  1500     0.0      30
11   7900   JAMES     CLERK  7698.0  1981-12-03   950     NaN      30

上面的语句通过布尔运算将 True 或 False 对象传递给 DataFrame 对象,然后返回所有为 True 的行。

GroupBy

在 SQL 语句中,通过 GroupBy 操作可以获取 table 中一组记录的计数。示例如下:

SELECT id, count(*) FROM EMP GROUP BY DEPTNO;

而 Pandas 可通过以下代码实现:

df.groupby('DEPTNO').size()

完整的程序如下所示:

import pandas as pd
import numpy as np
df = pd.read_excel("C:\\Users\\qwy\\Desktop\\data\\empdata.xlsx")
emp_count = df.groupby('DEPTNO').size()
# 或者使用agg或aggregate函数
# emp_count = df.groupby('DEPTNO').aggregate({'EMPNO':np.size,'SAL':np.mean})
print(emp_count)

输出结果:

DEPTNO
10    3
20    5
30    6
dtype: int64

LIMIT

在 SQL 中,LIMIT 语句主要起到限制作用,比如查询前 n 行记录:

SELECT * FROM EMP LIMIT n;

而在 Pandas 中,您可以通过 head() 来实现(默认前 5 行),示例如下:

import pandas as pd
df = pd.read_excel("C:\\Users\\qwy\\Desktop\\data\\empdata.xlsx")
emp = df[['EMPNO','ENAME','JOB','MGR','HIREDATE','SAL','COMM' , 'DEPTNO']].head(5)
print(emp)

输出结果:

   EMPNO   ENAME       JOB     MGR    HIREDATE   SAL    COMM  DEPTNO
0   7369   SMITH     CLERK  7902.0  1980-12-17   800     NaN      20
1   7499   ALLEN  SALESMAN  7698.0  1981-02-20  1600   300.0      30
2   7521    WARD  SALESMAN  7698.0  1981-02-22  1250   500.0      30
3   7566   JONES   MANAGER  7839.0  1981-04-02  2975     NaN      20
4   7654  MARTIN  SALESMAN  7698.0  1981-09-28  1250  1400.0      30

以上通过对比的方式对 SQL 和 Pandas 做了简单讲解,希望对您有所帮助。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值