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 做了简单讲解,希望对您有所帮助。