Python Pandas - 与SQL的比较



Pandas 是一个强大的 Python 库,用于数据操作和分析,广泛应用于数据科学和工程领域。许多潜在的 Pandas 用户都来自 SQL 背景,SQL 是一种用于管理和查询关系数据库的语言。了解如何使用 Pandas 执行类似 SQL 的操作可以显著简化转换过程并提高生产力。

本教程并排比较了常见的 SQL 操作及其在 Pandas 中的等效操作,使用流行的“tips”数据集。

导入必要的库

在深入比较之前,让我们首先导入必要的库。

import pandas as pd
import numpy as np

我们还将加载 "tips" 数据集,本教程将始终使用该数据集。

import pandas as pd
url = 'https://raw.githubusercontent.com/pandas-dev/pandas/main/pandas/tests/io/data/csv/tips.csv'

tips=pd.read_csv(url)
print(tips.head())

输出如下:

    total_bill   tip      sex  smoker  day     time  size
0        16.99  1.01   Female      No  Sun  Dinner      2
1        10.34  1.66     Male      No  Sun  Dinner      3
2        21.01  3.50     Male      No  Sun  Dinner      3
3        23.68  3.31     Male      No  Sun  Dinner      2
4        24.59  3.61   Female      No  Sun  Dinner      4

选择列

在 SQL 中,SELECT 语句用于从表中检索特定列。选择是使用您选择的列的逗号分隔列表(或选择所有列的 *)进行的:

SELECT total_bill, tip, smoker, time
FROM tips
LIMIT 5;

在 Pandas 中,您可以通过使用列名列表从 DataFrame 中选择列来获得相同的结果:

tips[['total_bill', 'tip', 'smoker', 'time']].head(5)

示例

让我们检查一下显示所选列前五行的完整程序:

import pandas as pd
url = 'https://raw.githubusercontent.com/pandas-dev/pandas/main/pandas/tests/io/data/csv/tips.csv'
 
tips=pd.read_csv(url)
print(tips[['total_bill', 'tip', 'smoker', 'time']].head(5))

输出如下:

   total_bill   tip  smoker     time
0       16.99  1.01      No   Dinner
1       10.34  1.66      No   Dinner
2       21.01  3.50      No   Dinner
3       23.68  3.31      No   Dinner
4       24.59  3.61      No   Dinner

不使用列名列表调用 DataFrame 将显示所有列(类似于 SQL 的 *)。

过滤行

在 SQL 中,WHERE 子句用于根据特定条件过滤记录。

SELECT * FROM tips WHERE time = 'Dinner' LIMIT 5;

DataFrame 可以通过多种方式进行过滤;其中最直观的是使用布尔索引。

tips[tips['time'] == 'Dinner'].head(5)

示例

让我们检查一下显示时间等于“Dinner”的前五条记录的完整程序:

import pandas as pd
url = 'https://raw.githubusercontent.com/pandas-dev/pandas/main/pandas/tests/io/data/csv/tips.csv'

tips=pd.read_csv(url)
print(tips[tips['time'] == 'Dinner'].head(5))

输出如下:

   total_bill   tip      sex  smoker  day    time  size
0       16.99  1.01   Female     No   Sun  Dinner    2
1       10.34  1.66     Male     No   Sun  Dinner    3
2       21.01  3.50     Male     No   Sun  Dinner    3
3       23.68  3.31     Male     No   Sun  Dinner    2
4       24.59  3.61   Female     No   Sun  Dinner    4

上面的语句将 True/False 对象的 Series 传递给 DataFrame,返回所有值为 True 的行。

分组数据

SQL 的GROUP BY 子句用于对指定列中具有相同值的行进行分组,并对它们执行聚合函数。例如,要计算每种性别留下的消费小费数量:

SELECT sex, count(*)
FROM tips
GROUP BY sex;

在 Pandas 中,groupby() 方法用于获得相同的结果:

tips.groupby('sex').size()

示例

让我们检查一下显示按性别分组的小费数量的完整程序:

import pandas as pd

url = 'https://raw.githubusercontent.com/pandas-dev/pandas/main/pandas/tests/io/data/csv/tips.csv'

tips=pd.read_csv(url)
print(tips.groupby('sex').size())

输出如下:

sex
Female   87
Male    157
dtype: int64

限制行数

在 SQL 中,LIMIT 子句用于限制查询返回的行数。例如:

SELECT * FROM tips
LIMIT 5 ;

在 Pandas 中,head() 方法用于实现此目的:

tips.head(5)

示例

让我们检查一下显示 DataFrame 前五行的完整示例:

import pandas as pd

url = 'https://raw.githubusercontent.com/pandas-dev/pandas/main/pandas/tests/io/data/csv/tips.csv'

tips=pd.read_csv(url)
tips = tips[['smoker', 'day', 'time']].head(5)
print(tips)

输出如下:

   smoker   day     time
0      No   Sun   Dinner
1      No   Sun   Dinner
2      No   Sun   Dinner
3      No   Sun   Dinner
4      No   Sun   Dinner

这些是我们之前章节中学习的 Pandas 库中比较的一些基本操作。

广告