Author

Tony Duan

本文档提供了使用 SQL、R 和 Python 执行常见数据操作任务的综合指南。它可作为理解如何在这三种流行的数据分析工具中实现相似结果的参考。

1 设置与配置

Code
library(reticulate)
py_require(c("pandas","Great-Tables","polars","pyarrow"))

# Load libraries for database interaction, data manipulation, and connections.
library(DBI)
library(tidyverse)
library(RSQLite)
library(connections)
library(duckdb)

# Prepare the R dataframes.
# Remove the existing mtcars dataset if it exists.
rm(mtcars)
# Create the mtcars dataframe from the base R dataset, adding the row names as a new column.
mtcars = cbind(model_name = rownames(mtcars), mtcars) |> head(10)
# Create the iris dataframe from the base R dataset.
iris = iris |> head(10)

# Remove the database file if it already exists to start with a clean slate.
if (file.exists("my-db.duckdb")) {
  file.remove("my-db.duckdb")
}
# Establish a connection to the DuckDB database.
con <- dbConnect(duckdb(), dbdir = "my-db.duckdb", read_only = FALSE)
# Write the iris and mtcars dataframes to the database as tables.
dbWriteTable(con, "iris_table", iris, overwrite = TRUE)
dbWriteTable(con, "mtcars_table", mtcars, overwrite = TRUE)
Code
import pandas as pd
import polars as pl
import os

from platform import python_version
#print(python_version())

cities_pd = pd.DataFrame({
    'country': ['NL', 'NL', 'NL', 'US', 'US', 'US', 'US', 'US', 'US'],
    'name': ['Amsterdam', 'Amsterdam', 'Amsterdam', 'Seattle', 'Seattle', 'Seattle', 'New York City', 'New York City', 'New York City'],
    'year': [2000, 2010, 2020, 2000, 2010, 2020, 2000, 2010, 2020],
    'population': [1005, 1065, 1158, 564, 608, 738, 8015, 8175, 8772]
})

# Make the R dataframes available in the Python environment.
mtcars_pd = r.mtcars
iris_pd = r.iris
mtcars_pl = pl.from_pandas(mtcars_pd)
iris_pl = pl.from_pandas(iris_pd)
cities_pl=pl.from_pandas(cities_pd)
  • DuckDB 数据库 my-db.duckdb 中有 iris_tablemtcars_table 表。
  • R 环境中有 irismtcars 数据框。
  • Python 环境中有 irismtcars 数据框。

2 显示所有表

本节演示如何列出每个环境中的所有可用表或数据框。

Code
-- 显示所连接数据库中的所有表。
SHOW ALL TABLES;
2 records
database schema name column_names column_types temporary
my-db main iris_table Sepal.Length, Sepal.Width , Petal.Length, Petal.Width , Species DOUBLE , DOUBLE , DOUBLE , DOUBLE , ENUM(‘setosa’, ‘versicolor’, ‘virginica’) FALSE
my-db main mtcars_table model_name, mpg , cyl , disp , hp , drat , wt , qsec , vs , am , gear , carb VARCHAR, DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE FALSE
Code
# 列出当前 R 环境中的所有数据框。
dflist <- Filter(is.data.frame, as.list(.GlobalEnv))
names(dflist)
[1] "mtcars" "iris"  
Code
# 列出当前 Python 环境中的所有 pandas 数据框。
import pandas as pd
alldfs = [var for var in dir() if isinstance(eval(var), pd.core.frame.DataFrame)]
print(alldfs)
['cities_pd', 'iris_pd', 'mtcars_pd']
Code
import polars as pl

alldfs = [name for name, val in globals().items() if isinstance(val, pl.DataFrame)]
print(alldfs)
['mtcars_pl', 'iris_pl', 'cities_pl']

3 描述表

本节介绍如何获取表结构和统计信息的摘要。

Code
-- 描述 mtcars_table 的列和数据类型。
DESCRIBE mtcars_table;
Displaying records 1 - 10
column_name column_type null key default extra
model_name VARCHAR YES NA NA NA
mpg DOUBLE YES NA NA NA
cyl DOUBLE YES NA NA NA
disp DOUBLE YES NA NA NA
hp DOUBLE YES NA NA NA
drat DOUBLE YES NA NA NA
wt DOUBLE YES NA NA NA
qsec DOUBLE YES NA NA NA
vs DOUBLE YES NA NA NA
am DOUBLE YES NA NA NA
Code
# 提供 mtcars 数据框的详细摘要。
skimr::skim(mtcars)
Data summary
Name mtcars
Number of rows 10
Number of columns 12
_______________________
Column type frequency:
character 1
numeric 11
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
model_name 0 1 7 17 0 10 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
mpg 0 1 20.37 2.91 14.30 18.82 21.00 22.45 24.40 ▂▂▅▇▇
cyl 0 1 5.80 1.48 4.00 4.50 6.00 6.00 8.00 ▅▁▇▁▃
disp 0 1 208.61 90.37 108.00 150.02 163.80 249.75 360.00 ▇▇▅▁▅
hp 0 1 122.80 51.45 62.00 97.50 110.00 119.75 245.00 ▅▇▁▂▂
drat 0 1 3.54 0.44 2.76 3.16 3.77 3.90 3.92 ▁▃▁▁▇
wt 0 1 3.13 0.41 2.32 2.94 3.20 3.44 3.57 ▂▂▂▆▇
qsec 0 1 18.58 2.14 15.84 17.02 18.45 19.86 22.90 ▇▃▃▂▂
vs 0 1 0.60 0.52 0.00 0.00 1.00 1.00 1.00 ▅▁▁▁▇
am 0 1 0.30 0.48 0.00 0.00 0.00 0.75 1.00 ▇▁▁▁▃
gear 0 1 3.60 0.52 3.00 3.00 4.00 4.00 4.00 ▅▁▁▁▇
carb 0 1 2.50 1.35 1.00 1.25 2.00 4.00 4.00 ▆▆▁▁▇
Code
# 生成 mtcars 数据框的描述性统计信息。
mtcars_pd.describe(include='all')
       model_name        mpg       cyl  ...         am       gear       carb
count          10  10.000000  10.00000  ...  10.000000  10.000000  10.000000
unique         10        NaN       NaN  ...        NaN        NaN        NaN
top     Mazda RX4        NaN       NaN  ...        NaN        NaN        NaN
freq            1        NaN       NaN  ...        NaN        NaN        NaN
mean          NaN  20.370000   5.80000  ...   0.300000   3.600000   2.500000
std           NaN   2.907099   1.47573  ...   0.483046   0.516398   1.354006
min           NaN  14.300000   4.00000  ...   0.000000   3.000000   1.000000
25%           NaN  18.825000   4.50000  ...   0.000000   3.000000   1.250000
50%           NaN  21.000000   6.00000  ...   0.000000   4.000000   2.000000
75%           NaN  22.450000   6.00000  ...   0.750000   4.000000   4.000000
max           NaN  24.400000   8.00000  ...   1.000000   4.000000   4.000000

[11 rows x 12 columns]
Code
mtcars_pl.describe()
shape: (9, 13)
statistic model_name mpg cyl disp hp drat wt qsec vs am gear carb
str str f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64
"count" "10" 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.0 10.0
"null_count" "0" 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
"mean" null 20.37 5.8 208.61 122.8 3.538 3.128 18.581 0.6 0.3 3.6 2.5
"std" null 2.907099 1.47573 90.373896 51.449652 0.440651 0.40649 2.135845 0.516398 0.483046 0.516398 1.354006
"min" "Datsun 710" 14.3 4.0 108.0 62.0 2.76 2.32 15.84 0.0 0.0 3.0 1.0
"25%" null 18.7 4.0 146.7 95.0 3.15 2.875 17.02 0.0 0.0 3.0 1.0
"50%" null 21.0 6.0 167.6 110.0 3.85 3.215 18.61 1.0 0.0 4.0 2.0
"75%" null 22.8 6.0 258.0 123.0 3.9 3.44 20.0 1.0 1.0 4.0 4.0
"max" "Valiant" 24.4 8.0 360.0 245.0 3.92 3.57 22.9 1.0 1.0 4.0 4.0

4 显示列名

本节演示如何检索表的列名。

Code
-- 显示 mtcars_table 中列的信息。
PRAGMA table_info(mtcars_table);
Displaying records 1 - 10
cid name type notnull dflt_value pk
0 model_name VARCHAR FALSE NA FALSE
1 mpg DOUBLE FALSE NA FALSE
2 cyl DOUBLE FALSE NA FALSE
3 disp DOUBLE FALSE NA FALSE
4 hp DOUBLE FALSE NA FALSE
5 drat DOUBLE FALSE NA FALSE
6 wt DOUBLE FALSE NA FALSE
7 qsec DOUBLE FALSE NA FALSE
8 vs DOUBLE FALSE NA FALSE
9 am DOUBLE FALSE NA FALSE
Code
# 获取 mtcars 数据框的列名。
names(mtcars)
 [1] "model_name" "mpg"        "cyl"        "disp"       "hp"        
 [6] "drat"       "wt"         "qsec"       "vs"         "am"        
[11] "gear"       "carb"      
Code
# 从 mtcars 数据框获取列名列表。
import pandas as pd
list(mtcars_pd.columns.values)
['model_name', 'mpg', 'cyl', 'disp', 'hp', 'drat', 'wt', 'qsec', 'vs', 'am', 'gear', 'carb']
Code
# 从 mtcars 数据框获取列名列表。
mtcars_pl.columns
['model_name', 'mpg', 'cyl', 'disp', 'hp', 'drat', 'wt', 'qsec', 'vs', 'am', 'gear', 'carb']

5 选择

5.1 选择前 6 行并重命名

本节介绍如何选择列的子集、重命名它们并限制返回的行数。

Code
-- 选择并重命名列,将结果限制为前 6 行。
SELECT model_name as model, mpg, cyl FROM mtcars_table LIMIT 6;
6 records
model mpg cyl
Mazda RX4 21.0 6
Mazda RX4 Wag 21.0 6
Datsun 710 22.8 4
Hornet 4 Drive 21.4 6
Hornet Sportabout 18.7 8
Valiant 18.1 6
Code
# 从 mtcars 数据框的前 6 行中选择并重命名列。
head(mtcars, 6) |> select(model = model_name, mpg, cyl)
                              model  mpg cyl
Mazda RX4                 Mazda RX4 21.0   6
Mazda RX4 Wag         Mazda RX4 Wag 21.0   6
Datsun 710               Datsun 710 22.8   4
Hornet 4 Drive       Hornet 4 Drive 21.4   6
Hornet Sportabout Hornet Sportabout 18.7   8
Valiant                     Valiant 18.1   6
Code
# 重命名 mtcars 数据框中的列。
mtcars_pd.rename(columns={'model_name': 'model'})
                               model   mpg  cyl   disp  ...   vs   am  gear  carb
Mazda RX4                  Mazda RX4  21.0  6.0  160.0  ...  0.0  1.0   4.0   4.0
Mazda RX4 Wag          Mazda RX4 Wag  21.0  6.0  160.0  ...  0.0  1.0   4.0   4.0
Datsun 710                Datsun 710  22.8  4.0  108.0  ...  1.0  1.0   4.0   1.0
Hornet 4 Drive        Hornet 4 Drive  21.4  6.0  258.0  ...  1.0  0.0   3.0   1.0
Hornet Sportabout  Hornet Sportabout  18.7  8.0  360.0  ...  0.0  0.0   3.0   2.0
Valiant                      Valiant  18.1  6.0  225.0  ...  1.0  0.0   3.0   1.0
Duster 360                Duster 360  14.3  8.0  360.0  ...  0.0  0.0   3.0   4.0
Merc 240D                  Merc 240D  24.4  4.0  146.7  ...  1.0  0.0   4.0   2.0
Merc 230                    Merc 230  22.8  4.0  140.8  ...  1.0  0.0   4.0   2.0
Merc 280                    Merc 280  19.2  6.0  167.6  ...  1.0  0.0   4.0   4.0

[10 rows x 12 columns]
Code
mtcars_pl.select(pl.col("model_name").alias("model"), pl.col("mpg"), pl.col("cyl")).head(6)
shape: (6, 3)
model mpg cyl
str f64 f64
"Mazda RX4" 21.0 6.0
"Mazda RX4 Wag" 21.0 6.0
"Datsun 710" 22.8 4.0
"Hornet 4 Drive" 21.4 6.0
"Hornet Sportabout" 18.7 8.0
"Valiant" 18.1 6.0

5.2 选择不同行

本节演示如何根据指定的列检索唯一的行。

Code
-- 选择 mpg 和 cyl 的不同组合。
SELECT DISTINCT mpg, cyl FROM mtcars_table;
8 records
mpg cyl
22.8 4
18.1 6
14.3 8
19.2 6
21.0 6
21.4 6
24.4 4
18.7 8
Code
# 根据 mpg 和 cyl 获取不同的行。
mtcars |> distinct(mpg, cyl)
                   mpg cyl
Mazda RX4         21.0   6
Datsun 710        22.8   4
Hornet 4 Drive    21.4   6
Hornet Sportabout 18.7   8
Valiant           18.1   6
Duster 360        14.3   8
Merc 240D         24.4   4
Merc 280          19.2   6
Code
# 选择特定列并删除重复行。
df = mtcars_pd[["mpg", "cyl"]]
print(df.drop_duplicates())
                    mpg  cyl
Mazda RX4          21.0  6.0
Datsun 710         22.8  4.0
Hornet 4 Drive     21.4  6.0
Hornet Sportabout  18.7  8.0
Valiant            18.1  6.0
Duster 360         14.3  8.0
Merc 240D          24.4  4.0
Merc 280           19.2  6.0
Code
mtcars_pl.select(pl.col("mpg"), pl.col("cyl")).unique()
shape: (8, 2)
mpg cyl
f64 f64
19.2 6.0
22.8 4.0
18.1 6.0
18.7 8.0
24.4 4.0
21.4 6.0
21.0 6.0
14.3 8.0

6 检查行数和列数

本节介绍如何查找表的维度。

Code
-- 获取总行数。
SELECT count(*) AS row_number FROM mtcars_table;
1 records
row_number
10
Code
-- 获取总列数。
SELECT count(*) AS column_number FROM (DESCRIBE mtcars_table);
1 records
column_number
12
Code
# 获取行数。
nrow(mtcars)
[1] 10
Code
# 获取列数。
ncol(mtcars)
[1] 12
Code
# 获取行数。
mtcars_pd.shape[0]
10
Code
# 获取列数。
mtcars_pd.shape[1]
12
Code
# 获取行数。
mtcars_pl.shape[0]
10
Code
# 获取列数。
mtcars_pl.shape[1]
12

7 创建列

本节演示如何基于现有数据向表中添加新列。

Code
-- 通过对现有列执行计算来创建新列。
SELECT *, mpg + 1 AS new_mpg FROM mtcars_table;
Displaying records 1 - 10
model_name mpg cyl disp hp drat wt qsec vs am gear carb new_mpg
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 22.0
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 22.0
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 23.8
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 22.4
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 19.7
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 19.1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4 15.3
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2 25.4
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 23.8
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4 20.2
Code
# 向数据框添加新列。
mtcars |> mutate(new_mpg = mpg + 1)
                         model_name  mpg cyl  disp  hp drat    wt  qsec vs am
Mazda RX4                 Mazda RX4 21.0   6 160.0 110 3.90 2.620 16.46  0  1
Mazda RX4 Wag         Mazda RX4 Wag 21.0   6 160.0 110 3.90 2.875 17.02  0  1
Datsun 710               Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1  1
Hornet 4 Drive       Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0
Hornet Sportabout Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0
Valiant                     Valiant 18.1   6 225.0 105 2.76 3.460 20.22  1  0
Duster 360               Duster 360 14.3   8 360.0 245 3.21 3.570 15.84  0  0
Merc 240D                 Merc 240D 24.4   4 146.7  62 3.69 3.190 20.00  1  0
Merc 230                   Merc 230 22.8   4 140.8  95 3.92 3.150 22.90  1  0
Merc 280                   Merc 280 19.2   6 167.6 123 3.92 3.440 18.30  1  0
                  gear carb new_mpg
Mazda RX4            4    4    22.0
Mazda RX4 Wag        4    4    22.0
Datsun 710           4    1    23.8
Hornet 4 Drive       3    1    22.4
Hornet Sportabout    3    2    19.7
Valiant              3    1    19.1
Duster 360           3    4    15.3
Merc 240D            4    2    25.4
Merc 230             4    2    23.8
Merc 280             4    4    20.2
Code
# 在数据框中创建新列。
mtcars_pd["new_mpg"] = mtcars_pd["mpg"] + 1
mtcars_pd
                          model_name   mpg  cyl  ...  gear  carb  new_mpg
Mazda RX4                  Mazda RX4  21.0  6.0  ...   4.0   4.0     22.0
Mazda RX4 Wag          Mazda RX4 Wag  21.0  6.0  ...   4.0   4.0     22.0
Datsun 710                Datsun 710  22.8  4.0  ...   4.0   1.0     23.8
Hornet 4 Drive        Hornet 4 Drive  21.4  6.0  ...   3.0   1.0     22.4
Hornet Sportabout  Hornet Sportabout  18.7  8.0  ...   3.0   2.0     19.7
Valiant                      Valiant  18.1  6.0  ...   3.0   1.0     19.1
Duster 360                Duster 360  14.3  8.0  ...   3.0   4.0     15.3
Merc 240D                  Merc 240D  24.4  4.0  ...   4.0   2.0     25.4
Merc 230                    Merc 230  22.8  4.0  ...   4.0   2.0     23.8
Merc 280                    Merc 280  19.2  6.0  ...   4.0   4.0     20.2

[10 rows x 13 columns]
Code
mtcars_pl.with_columns((pl.col("mpg") + 1).alias("new_mpg"))
shape: (10, 13)
model_name mpg cyl disp hp drat wt qsec vs am gear carb new_mpg
str f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64
"Mazda RX4" 21.0 6.0 160.0 110.0 3.9 2.62 16.46 0.0 1.0 4.0 4.0 22.0
"Mazda RX4 Wag" 21.0 6.0 160.0 110.0 3.9 2.875 17.02 0.0 1.0 4.0 4.0 22.0
"Datsun 710" 22.8 4.0 108.0 93.0 3.85 2.32 18.61 1.0 1.0 4.0 1.0 23.8
"Hornet 4 Drive" 21.4 6.0 258.0 110.0 3.08 3.215 19.44 1.0 0.0 3.0 1.0 22.4
"Hornet Sportabout" 18.7 8.0 360.0 175.0 3.15 3.44 17.02 0.0 0.0 3.0 2.0 19.7
"Valiant" 18.1 6.0 225.0 105.0 2.76 3.46 20.22 1.0 0.0 3.0 1.0 19.1
"Duster 360" 14.3 8.0 360.0 245.0 3.21 3.57 15.84 0.0 0.0 3.0 4.0 15.3
"Merc 240D" 24.4 4.0 146.7 62.0 3.69 3.19 20.0 1.0 0.0 4.0 2.0 25.4
"Merc 230" 22.8 4.0 140.8 95.0 3.92 3.15 22.9 1.0 0.0 4.0 2.0 23.8
"Merc 280" 19.2 6.0 167.6 123.0 3.92 3.44 18.3 1.0 0.0 4.0 4.0 20.2

8 筛选

本节介绍如何选择满足特定条件的行。

Code
-- 使用 AND 运算符根据多个条件筛选行。
SELECT * FROM mtcars_table WHERE mpg = 21 AND cyl = 6;
2 records
model_name mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21 6 160 110 3.9 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21 6 160 110 3.9 2.875 17.02 0 1 4 4
Code
-- 使用 OR 运算符筛选行。
SELECT * FROM mtcars_table WHERE mpg = 21 OR cyl = 6;
5 records
model_name mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Code
# 使用 & 运算符进行“与”筛选。
mtcars |> filter(mpg == 21 & cyl == 6)
                 model_name mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         Mazda RX4  21   6  160 110  3.9 2.620 16.46  0  1    4    4
Mazda RX4 Wag Mazda RX4 Wag  21   6  160 110  3.9 2.875 17.02  0  1    4    4
Code
# 使用 | 运算符进行“或”筛选。
mtcars |> filter(mpg == 21 | cyl == 6)
                   model_name  mpg cyl  disp  hp drat    wt  qsec vs am gear
Mazda RX4           Mazda RX4 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4
Mazda RX4 Wag   Mazda RX4 Wag 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4
Hornet 4 Drive Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3
Valiant               Valiant 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3
Merc 280             Merc 280 19.2   6 167.6 123 3.92 3.440 18.30  1  0    4
               carb
Mazda RX4         4
Mazda RX4 Wag     4
Hornet 4 Drive    1
Valiant           1
Merc 280          4
Code
# 使用 query 方法进行“与”筛选。
mtcars_pd.query('mpg == 21 and cyl == 6')
                  model_name   mpg  cyl   disp  ...   am  gear  carb  new_mpg
Mazda RX4          Mazda RX4  21.0  6.0  160.0  ...  1.0   4.0   4.0     22.0
Mazda RX4 Wag  Mazda RX4 Wag  21.0  6.0  160.0  ...  1.0   4.0   4.0     22.0

[2 rows x 13 columns]
Code
# 使用 query 方法进行“或”筛选。
mtcars_pd.query('mpg == 21 or cyl == 6')
                    model_name   mpg  cyl   disp  ...   am  gear  carb  new_mpg
Mazda RX4            Mazda RX4  21.0  6.0  160.0  ...  1.0   4.0   4.0     22.0
Mazda RX4 Wag    Mazda RX4 Wag  21.0  6.0  160.0  ...  1.0   4.0   4.0     22.0
Hornet 4 Drive  Hornet 4 Drive  21.4  6.0  258.0  ...  0.0   3.0   1.0     22.4
Valiant                Valiant  18.1  6.0  225.0  ...  0.0   3.0   1.0     19.1
Merc 280              Merc 280  19.2  6.0  167.6  ...  0.0   4.0   4.0     20.2

[5 rows x 13 columns]
Code
# polars 的“与”筛选
mtcars_pl.filter((pl.col("mpg") == 21) & (pl.col("cyl") == 6))
shape: (2, 12)
model_name mpg cyl disp hp drat wt qsec vs am gear carb
str f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64
"Mazda RX4" 21.0 6.0 160.0 110.0 3.9 2.62 16.46 0.0 1.0 4.0 4.0
"Mazda RX4 Wag" 21.0 6.0 160.0 110.0 3.9 2.875 17.02 0.0 1.0 4.0 4.0
Code
# polars 的“或”筛选
mtcars_pl.filter((pl.col("mpg") == 21) | (pl.col("cyl") == 6))
shape: (5, 12)
model_name mpg cyl disp hp drat wt qsec vs am gear carb
str f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64
"Mazda RX4" 21.0 6.0 160.0 110.0 3.9 2.62 16.46 0.0 1.0 4.0 4.0
"Mazda RX4 Wag" 21.0 6.0 160.0 110.0 3.9 2.875 17.02 0.0 1.0 4.0 4.0
"Hornet 4 Drive" 21.4 6.0 258.0 110.0 3.08 3.215 19.44 1.0 0.0 3.0 1.0
"Valiant" 18.1 6.0 225.0 105.0 2.76 3.46 20.22 1.0 0.0 3.0 1.0
"Merc 280" 19.2 6.0 167.6 123.0 3.92 3.44 18.3 1.0 0.0 4.0 4.0

9 排序

本节演示如何根据一个或多个列对表进行排序。

Code
-- 按 mpg 降序对结果进行排序,并显示前 3 行。
SELECT model_name AS model, mpg, cyl FROM mtcars_table ORDER BY mpg DESC LIMIT 3;
3 records
model mpg cyl
Merc 240D 24.4 4
Datsun 710 22.8 4
Merc 230 22.8 4
Code
# 按 mpg 降序排列数据框。
mtcars |> select(model = model_name, mpg, cyl) |> arrange(desc(mpg)) |> head(3)
                model  mpg cyl
Merc 240D   Merc 240D 24.4   4
Datsun 710 Datsun 710 22.8   4
Merc 230     Merc 230 22.8   4
Code
# 按 mpg 降序对数据框进行排序。
mtcars_pd[["model_name", "mpg", "cyl"]].sort_values(by='mpg', ascending=False).head(3)
            model_name   mpg  cyl
Merc 240D    Merc 240D  24.4  4.0
Datsun 710  Datsun 710  22.8  4.0
Merc 230      Merc 230  22.8  4.0
Code
mtcars_pl.select("model_name", "mpg", "cyl").sort("mpg", descending=True).head(3)
shape: (3, 3)
model_name mpg cyl
str f64 f64
"Merc 240D" 24.4 4.0
"Datsun 710" 22.8 4.0
"Merc 230" 22.8 4.0

10 分组

本节介绍如何对行进行分组并执行聚合计算。

Code
-- 按 model_name 分组,并计算 mpg 的总和和 cyl 的平均值。
SELECT model_name, sum(mpg) AS total_mpg, mean(cyl) AS cyl_mean FROM mtcars_table
GROUP BY 1 LIMIT 5;
5 records
model_name total_mpg cyl_mean
Merc 240D 24.4 4
Hornet Sportabout 18.7 8
Mazda RX4 Wag 21.0 6
Duster 360 14.3 8
Merc 230 22.8 4
Code
# 按 model_name 分组并汇总数据。
mtcars |> group_by(model_name) |> summarise(total_mpg = sum(mpg), cyl_mean = mean(cyl)) |> head(5)
# A tibble: 5 × 3
  model_name        total_mpg cyl_mean
  <chr>                 <dbl>    <dbl>
1 Datsun 710             22.8        4
2 Duster 360             14.3        8
3 Hornet 4 Drive         21.4        6
4 Hornet Sportabout      18.7        8
5 Mazda RX4              21          6
Code
# 按 model_name 分组并聚合数据。
mtcars_pd.groupby('model_name').agg({'mpg': 'sum', 'cyl': 'mean'}).head(5)
                    mpg  cyl
model_name                  
Datsun 710         22.8  4.0
Duster 360         14.3  8.0
Hornet 4 Drive     21.4  6.0
Hornet Sportabout  18.7  8.0
Mazda RX4          21.0  6.0
Code
mtcars_pl.group_by("model_name").agg([
    pl.sum("mpg").alias("total_mpg"),
    pl.mean("cyl").alias("cyl_mean")
]).head(5)
shape: (5, 3)
model_name total_mpg cyl_mean
str f64 f64
"Mazda RX4" 21.0 6.0
"Hornet Sportabout" 18.7 8.0
"Valiant" 18.1 6.0
"Merc 280" 19.2 6.0
"Merc 240D" 24.4 4.0

11 创建表

11.1 CREATE OR REPLACE

此命令创建新表或覆盖现有表。

Code
-- 创建一个临时表,如果它已存在则替换它。
CREATE OR REPLACE TEMP TABLE mtcars_table_group AS
SELECT model_name, sum(mpg) AS total_mpg, mean(cyl) AS cyl_mean FROM mtcars_table
GROUP BY 1;

11.2 CREATE TABLE IF NOT EXISTS

此命令仅在表尚不存在时创建表。

Code
-- 仅在尚不存在的情况下创建新表。
CREATE TABLE IF NOT EXISTS new_mtcars_table_group AS
SELECT model_name, sum(mpg) AS total_mpg, mean(cyl) AS cyl_mean FROM mtcars_table
GROUP BY 1;

12 唯一值

12.1 检查唯一值

本节演示如何验证列中值的唯一性。

Code
-- 计算总行数和不同 model_name 的数量。
SELECT count(*), count(DISTINCT model_name) FROM mtcars_table;
1 records
count_star() count(DISTINCT model_name)
10 10
Code
# 计算总行数和不同 model_name 的数量。
print(len(mtcars_pd), mtcars_pd.model_name.nunique())
10 10
Code
# 计算总行数和不同 model_name 的数量。
mtcars_pl.select(pl.count(), pl.col("model_name").n_unique())
shape: (1, 2)
count model_name
u32 u32
10 10

12.2 获取重复和非重复数据

本节演示如何根据单个列获取重复和非重复数据。

12.2.0.1 显示所有重复项

Code
-- 根据 mpg 列获取重复行。
SELECT * FROM mtcars_table WHERE mpg IN (SELECT mpg FROM mtcars_table GROUP BY mpg HAVING count(*) > 1);
4 records
model_name mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2

保留非重复项

Code
-- 根据 mpg 列获取非重复行。
SELECT * FROM mtcars_table WHERE mpg IN (SELECT mpg FROM mtcars_table GROUP BY mpg HAVING count(*) = 1);
6 records
model_name mpg cyl disp hp drat wt qsec vs am gear carb
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4

12.2.0.2 显示所有重复项

Code
# 根据 mpg 列获取重复行。
mtcars |> filter(duplicated(mpg) | duplicated(mpg, fromLast = TRUE))
                 model_name  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         Mazda RX4 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag Mazda RX4 Wag 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710       Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Merc 230           Merc 230 22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2

12.2.0.3 保留非重复项

Code
# 根据 mpg 列获取非重复行。
mtcars |> filter(!duplicated(mpg) & !duplicated(mpg, fromLast = TRUE))
                         model_name  mpg cyl  disp  hp drat    wt  qsec vs am
Hornet 4 Drive       Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0
Hornet Sportabout Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0
Valiant                     Valiant 18.1   6 225.0 105 2.76 3.460 20.22  1  0
Duster 360               Duster 360 14.3   8 360.0 245 3.21 3.570 15.84  0  0
Merc 240D                 Merc 240D 24.4   4 146.7  62 3.69 3.190 20.00  1  0
Merc 280                   Merc 280 19.2   6 167.6 123 3.92 3.440 18.30  1  0
                  gear carb
Hornet 4 Drive       3    1
Hornet Sportabout    3    2
Valiant              3    1
Duster 360           3    4
Merc 240D            4    2
Merc 280             4    4

12.2.0.4 显示所有重复项

Code
# 根据 mpg 列获取重复行。
mtcars_pd[mtcars_pd.duplicated(subset=['mpg'], keep=False)]
                  model_name   mpg  cyl   disp  ...   am  gear  carb  new_mpg
Mazda RX4          Mazda RX4  21.0  6.0  160.0  ...  1.0   4.0   4.0     22.0
Mazda RX4 Wag  Mazda RX4 Wag  21.0  6.0  160.0  ...  1.0   4.0   4.0     22.0
Datsun 710        Datsun 710  22.8  4.0  108.0  ...  1.0   4.0   1.0     23.8
Merc 230            Merc 230  22.8  4.0  140.8  ...  0.0   4.0   2.0     23.8

[4 rows x 13 columns]

12.2.0.5 保留非重复项

Code
# 根据 mpg 列获取非重复行。
mtcars_pd[~mtcars_pd.duplicated(subset=['mpg'], keep=False)]
                          model_name   mpg  cyl  ...  gear  carb  new_mpg
Hornet 4 Drive        Hornet 4 Drive  21.4  6.0  ...   3.0   1.0     22.4
Hornet Sportabout  Hornet Sportabout  18.7  8.0  ...   3.0   2.0     19.7
Valiant                      Valiant  18.1  6.0  ...   3.0   1.0     19.1
Duster 360                Duster 360  14.3  8.0  ...   3.0   4.0     15.3
Merc 240D                  Merc 240D  24.4  4.0  ...   4.0   2.0     25.4
Merc 280                    Merc 280  19.2  6.0  ...   4.0   4.0     20.2

[6 rows x 13 columns]
Code
# 根据 mpg 列获取重复行。
mtcars_pl.filter(pl.col("mpg").is_duplicated())
shape: (4, 12)
model_name mpg cyl disp hp drat wt qsec vs am gear carb
str f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64
"Mazda RX4" 21.0 6.0 160.0 110.0 3.9 2.62 16.46 0.0 1.0 4.0 4.0
"Mazda RX4 Wag" 21.0 6.0 160.0 110.0 3.9 2.875 17.02 0.0 1.0 4.0 4.0
"Datsun 710" 22.8 4.0 108.0 93.0 3.85 2.32 18.61 1.0 1.0 4.0 1.0
"Merc 230" 22.8 4.0 140.8 95.0 3.92 3.15 22.9 1.0 0.0 4.0 2.0

12.2.0.6 保留非重复项

Code
# 根据 mpg 列获取非重复行。
mtcars_pl.filter(pl.col("mpg").is_unique())
shape: (6, 12)
model_name mpg cyl disp hp drat wt qsec vs am gear carb
str f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64
"Hornet 4 Drive" 21.4 6.0 258.0 110.0 3.08 3.215 19.44 1.0 0.0 3.0 1.0
"Hornet Sportabout" 18.7 8.0 360.0 175.0 3.15 3.44 17.02 0.0 0.0 3.0 2.0
"Valiant" 18.1 6.0 225.0 105.0 2.76 3.46 20.22 1.0 0.0 3.0 1.0
"Duster 360" 14.3 8.0 360.0 245.0 3.21 3.57 15.84 0.0 0.0 3.0 4.0
"Merc 240D" 24.4 4.0 146.7 62.0 3.69 3.19 20.0 1.0 0.0 4.0 2.0
"Merc 280" 19.2 6.0 167.6 123.0 3.92 3.44 18.3 1.0 0.0 4.0 4.0

13 连接

Code
-- 从新创建的临时表中选择所有数据。
SELECT * FROM mtcars_table_group t1;
Displaying records 1 - 10
model_name total_mpg cyl_mean
Merc 240D 24.4 4
Mazda RX4 21.0 6
Datsun 710 22.8 4
Mazda RX4 Wag 21.0 6
Hornet 4 Drive 21.4 6
Merc 280 19.2 6
Duster 360 14.3 8
Merc 230 22.8 4
Hornet Sportabout 18.7 8
Valiant 18.1 6

13.1 左连接

本节介绍如何执行左连接以组合来自两个表的数据。

Code
-- 在 mtcars_table 和 mtcars_table_group 之间执行左连接。
SELECT t1.model_name, t1.mpg, t1.cyl, t2.* FROM mtcars_table t1
LEFT JOIN mtcars_table_group t2 ON t1.model_name = t2.model_name
LIMIT 5;
5 records
model_name mpg cyl model_name total_mpg cyl_mean
Mazda RX4 21.0 6 Mazda RX4 21.0 6
Mazda RX4 Wag 21.0 6 Mazda RX4 Wag 21.0 6
Datsun 710 22.8 4 Datsun 710 22.8 4
Hornet 4 Drive 21.4 6 Hornet 4 Drive 21.4 6
Hornet Sportabout 18.7 8 Hornet Sportabout 18.7 8
Code
# 对 mtcars 数据框与其自身执行左连接。
mtcars |> left_join(mtcars, by = join_by(model_name == model_name)) |> head(5)
         model_name mpg.x cyl.x disp.x hp.x drat.x  wt.x qsec.x vs.x am.x
1         Mazda RX4  21.0     6    160  110   3.90 2.620  16.46    0    1
2     Mazda RX4 Wag  21.0     6    160  110   3.90 2.875  17.02    0    1
3        Datsun 710  22.8     4    108   93   3.85 2.320  18.61    1    1
4    Hornet 4 Drive  21.4     6    258  110   3.08 3.215  19.44    1    0
5 Hornet Sportabout  18.7     8    360  175   3.15 3.440  17.02    0    0
  gear.x carb.x mpg.y cyl.y disp.y hp.y drat.y  wt.y qsec.y vs.y am.y gear.y
1      4      4  21.0     6    160  110   3.90 2.620  16.46    0    1      4
2      4      4  21.0     6    160  110   3.90 2.875  17.02    0    1      4
3      4      1  22.8     4    108   93   3.85 2.320  18.61    1    1      4
4      3      1  21.4     6    258  110   3.08 3.215  19.44    1    0      3
5      3      2  18.7     8    360  175   3.15 3.440  17.02    0    0      3
  carb.y
1      4
2      4
3      1
4      1
5      2
Code
# 使用 pandas 执行左连接。
pd.merge(mtcars_pd, mtcars_pd, left_on='model_name', right_on='model_name', how='left').head(5)
          model_name  mpg_x  cyl_x  disp_x  ...  am_y  gear_y  carb_y  new_mpg_y
0          Mazda RX4   21.0    6.0   160.0  ...   1.0     4.0     4.0       22.0
1      Mazda RX4 Wag   21.0    6.0   160.0  ...   1.0     4.0     4.0       22.0
2         Datsun 710   22.8    4.0   108.0  ...   1.0     4.0     1.0       23.8
3     Hornet 4 Drive   21.4    6.0   258.0  ...   0.0     3.0     1.0       22.4
4  Hornet Sportabout   18.7    8.0   360.0  ...   0.0     3.0     2.0       19.7

[5 rows x 25 columns]
Code
mtcars_pl.join(mtcars_pl, on="model_name", how="left").head(5)
shape: (5, 23)
model_name mpg cyl disp hp drat wt qsec vs am gear carb mpg_right cyl_right disp_right hp_right drat_right wt_right qsec_right vs_right am_right gear_right carb_right
str f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64
"Mazda RX4" 21.0 6.0 160.0 110.0 3.9 2.62 16.46 0.0 1.0 4.0 4.0 21.0 6.0 160.0 110.0 3.9 2.62 16.46 0.0 1.0 4.0 4.0
"Mazda RX4 Wag" 21.0 6.0 160.0 110.0 3.9 2.875 17.02 0.0 1.0 4.0 4.0 21.0 6.0 160.0 110.0 3.9 2.875 17.02 0.0 1.0 4.0 4.0
"Datsun 710" 22.8 4.0 108.0 93.0 3.85 2.32 18.61 1.0 1.0 4.0 1.0 22.8 4.0 108.0 93.0 3.85 2.32 18.61 1.0 1.0 4.0 1.0
"Hornet 4 Drive" 21.4 6.0 258.0 110.0 3.08 3.215 19.44 1.0 0.0 3.0 1.0 21.4 6.0 258.0 110.0 3.08 3.215 19.44 1.0 0.0 3.0 1.0
"Hornet Sportabout" 18.7 8.0 360.0 175.0 3.15 3.44 17.02 0.0 0.0 3.0 2.0 18.7 8.0 360.0 175.0 3.15 3.44 17.02 0.0 0.0 3.0 2.0

13.2 内连接

本节演示如何执行内连接。

Code
-- 使用子查询执行内连接。
SELECT t1.model_name, t1.mpg, t1.cyl, t2.* FROM mtcars_table t1
INNER JOIN (SELECT * FROM mtcars_table_group LIMIT 5) t2 ON t1.model_name = t2.model_name;
5 records
model_name mpg cyl model_name total_mpg cyl_mean
Mazda RX4 21.0 6 Mazda RX4 21.0 6
Mazda RX4 Wag 21.0 6 Mazda RX4 Wag 21.0 6
Datsun 710 22.8 4 Datsun 710 22.8 4
Hornet 4 Drive 21.4 6 Hornet 4 Drive 21.4 6
Merc 240D 24.4 4 Merc 240D 24.4 4
Code
# 执行内连接。
mtcars |> inner_join(mtcars, by = join_by(model_name == model_name)) |> head(5)
         model_name mpg.x cyl.x disp.x hp.x drat.x  wt.x qsec.x vs.x am.x
1         Mazda RX4  21.0     6    160  110   3.90 2.620  16.46    0    1
2     Mazda RX4 Wag  21.0     6    160  110   3.90 2.875  17.02    0    1
3        Datsun 710  22.8     4    108   93   3.85 2.320  18.61    1    1
4    Hornet 4 Drive  21.4     6    258  110   3.08 3.215  19.44    1    0
5 Hornet Sportabout  18.7     8    360  175   3.15 3.440  17.02    0    0
  gear.x carb.x mpg.y cyl.y disp.y hp.y drat.y  wt.y qsec.y vs.y am.y gear.y
1      4      4  21.0     6    160  110   3.90 2.620  16.46    0    1      4
2      4      4  21.0     6    160  110   3.90 2.875  17.02    0    1      4
3      4      1  22.8     4    108   93   3.85 2.320  18.61    1    1      4
4      3      1  21.4     6    258  110   3.08 3.215  19.44    1    0      3
5      3      2  18.7     8    360  175   3.15 3.440  17.02    0    0      3
  carb.y
1      4
2      4
3      1
4      1
5      2
Code
# 使用 pandas 执行内连接。
pd.merge(mtcars_pd, mtcars_pd, left_on='model_name', right_on='model_name', how='inner').head(5)
          model_name  mpg_x  cyl_x  disp_x  ...  am_y  gear_y  carb_y  new_mpg_y
0          Mazda RX4   21.0    6.0   160.0  ...   1.0     4.0     4.0       22.0
1      Mazda RX4 Wag   21.0    6.0   160.0  ...   1.0     4.0     4.0       22.0
2         Datsun 710   22.8    4.0   108.0  ...   1.0     4.0     1.0       23.8
3     Hornet 4 Drive   21.4    6.0   258.0  ...   0.0     3.0     1.0       22.4
4  Hornet Sportabout   18.7    8.0   360.0  ...   0.0     3.0     2.0       19.7

[5 rows x 25 columns]
Code
mtcars_pl.join(mtcars_pl, on="model_name", how="inner").head(5)
shape: (5, 23)
model_name mpg cyl disp hp drat wt qsec vs am gear carb mpg_right cyl_right disp_right hp_right drat_right wt_right qsec_right vs_right am_right gear_right carb_right
str f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64
"Mazda RX4" 21.0 6.0 160.0 110.0 3.9 2.62 16.46 0.0 1.0 4.0 4.0 21.0 6.0 160.0 110.0 3.9 2.62 16.46 0.0 1.0 4.0 4.0
"Mazda RX4 Wag" 21.0 6.0 160.0 110.0 3.9 2.875 17.02 0.0 1.0 4.0 4.0 21.0 6.0 160.0 110.0 3.9 2.875 17.02 0.0 1.0 4.0 4.0
"Datsun 710" 22.8 4.0 108.0 93.0 3.85 2.32 18.61 1.0 1.0 4.0 1.0 22.8 4.0 108.0 93.0 3.85 2.32 18.61 1.0 1.0 4.0 1.0
"Hornet 4 Drive" 21.4 6.0 258.0 110.0 3.08 3.215 19.44 1.0 0.0 3.0 1.0 21.4 6.0 258.0 110.0 3.08 3.215 19.44 1.0 0.0 3.0 1.0
"Hornet Sportabout" 18.7 8.0 360.0 175.0 3.15 3.44 17.02 0.0 0.0 3.0 2.0 18.7 8.0 360.0 175.0 3.15 3.44 17.02 0.0 0.0 3.0 2.0

14 追加行

14.1 追加时不消除重复项 (union all)

本节介绍如何组合来自两个表的行,并保留所有重复项。

Code
-- 计算原始表中的行数。
SELECT count(*) FROM mtcars_table;
1 records
count_star()
10
Code
-- 通过将 mtcars_table 追加到自身(包括重复项)来创建新表。
CREATE TEMP TABLE double_mtcars_table AS
SELECT * FROM mtcars_table
UNION ALL
SELECT * FROM mtcars_table;
Code
-- 计算新表中的行数。
SELECT count(*) FROM double_mtcars_table;
1 records
count_star()
20
Code
# 使用 bind_rows 追加行。
mtcars %>% bind_rows(mtcars)
                              model_name  mpg cyl  disp  hp drat    wt  qsec vs
Mazda RX4...1                  Mazda RX4 21.0   6 160.0 110 3.90 2.620 16.46  0
Mazda RX4 Wag...2          Mazda RX4 Wag 21.0   6 160.0 110 3.90 2.875 17.02  0
Datsun 710...3                Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1
Hornet 4 Drive...4        Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1
Hornet Sportabout...5  Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0
Valiant...6                      Valiant 18.1   6 225.0 105 2.76 3.460 20.22  1
Duster 360...7                Duster 360 14.3   8 360.0 245 3.21 3.570 15.84  0
Merc 240D...8                  Merc 240D 24.4   4 146.7  62 3.69 3.190 20.00  1
Merc 230...9                    Merc 230 22.8   4 140.8  95 3.92 3.150 22.90  1
Merc 280...10                   Merc 280 19.2   6 167.6 123 3.92 3.440 18.30  1
Mazda RX4...11                 Mazda RX4 21.0   6 160.0 110 3.90 2.620 16.46  0
Mazda RX4 Wag...12         Mazda RX4 Wag 21.0   6 160.0 110 3.90 2.875 17.02  0
Datsun 710...13               Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1
Hornet 4 Drive...14       Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1
Hornet Sportabout...15 Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0
Valiant...16                     Valiant 18.1   6 225.0 105 2.76 3.460 20.22  1
Duster 360...17               Duster 360 14.3   8 360.0 245 3.21 3.570 15.84  0
Merc 240D...18                 Merc 240D 24.4   4 146.7  62 3.69 3.190 20.00  1
Merc 230...19                   Merc 230 22.8   4 140.8  95 3.92 3.150 22.90  1
Merc 280...20                   Merc 280 19.2   6 167.6 123 3.92 3.440 18.30  1
                       am gear carb
Mazda RX4...1           1    4    4
Mazda RX4 Wag...2       1    4    4
Datsun 710...3          1    4    1
Hornet 4 Drive...4      0    3    1
Hornet Sportabout...5   0    3    2
Valiant...6             0    3    1
Duster 360...7          0    3    4
Merc 240D...8           0    4    2
Merc 230...9            0    4    2
Merc 280...10           0    4    4
Mazda RX4...11          1    4    4
Mazda RX4 Wag...12      1    4    4
Datsun 710...13         1    4    1
Hornet 4 Drive...14     0    3    1
Hornet Sportabout...15  0    3    2
Valiant...16            0    3    1
Duster 360...17         0    3    4
Merc 240D...18          0    4    2
Merc 230...19           0    4    2
Merc 280...20           0    4    4
Code
# 连接数据框,保留所有行。
pd.concat([mtcars_pd, mtcars_pd], ignore_index=True)
           model_name   mpg  cyl   disp     hp  ...   vs   am  gear  carb  new_mpg
0           Mazda RX4  21.0  6.0  160.0  110.0  ...  0.0  1.0   4.0   4.0     22.0
1       Mazda RX4 Wag  21.0  6.0  160.0  110.0  ...  0.0  1.0   4.0   4.0     22.0
2          Datsun 710  22.8  4.0  108.0   93.0  ...  1.0  1.0   4.0   1.0     23.8
3      Hornet 4 Drive  21.4  6.0  258.0  110.0  ...  1.0  0.0   3.0   1.0     22.4
4   Hornet Sportabout  18.7  8.0  360.0  175.0  ...  0.0  0.0   3.0   2.0     19.7
5             Valiant  18.1  6.0  225.0  105.0  ...  1.0  0.0   3.0   1.0     19.1
6          Duster 360  14.3  8.0  360.0  245.0  ...  0.0  0.0   3.0   4.0     15.3
7           Merc 240D  24.4  4.0  146.7   62.0  ...  1.0  0.0   4.0   2.0     25.4
8            Merc 230  22.8  4.0  140.8   95.0  ...  1.0  0.0   4.0   2.0     23.8
9            Merc 280  19.2  6.0  167.6  123.0  ...  1.0  0.0   4.0   4.0     20.2
10          Mazda RX4  21.0  6.0  160.0  110.0  ...  0.0  1.0   4.0   4.0     22.0
11      Mazda RX4 Wag  21.0  6.0  160.0  110.0  ...  0.0  1.0   4.0   4.0     22.0
12         Datsun 710  22.8  4.0  108.0   93.0  ...  1.0  1.0   4.0   1.0     23.8
13     Hornet 4 Drive  21.4  6.0  258.0  110.0  ...  1.0  0.0   3.0   1.0     22.4
14  Hornet Sportabout  18.7  8.0  360.0  175.0  ...  0.0  0.0   3.0   2.0     19.7
15            Valiant  18.1  6.0  225.0  105.0  ...  1.0  0.0   3.0   1.0     19.1
16         Duster 360  14.3  8.0  360.0  245.0  ...  0.0  0.0   3.0   4.0     15.3
17          Merc 240D  24.4  4.0  146.7   62.0  ...  1.0  0.0   4.0   2.0     25.4
18           Merc 230  22.8  4.0  140.8   95.0  ...  1.0  0.0   4.0   2.0     23.8
19           Merc 280  19.2  6.0  167.6  123.0  ...  1.0  0.0   4.0   4.0     20.2

[20 rows x 13 columns]

14.2 追加时消除重复项 (union)

本节演示如何在组合行时删除重复条目。

Code
-- 创建一个表,删除重复行。
CREATE OR REPLACE TEMP TABLE double_mtcars_table AS
SELECT * FROM mtcars_table
UNION
SELECT * FROM mtcars_table;
Code
-- 计算新表中的行数。
SELECT count(*) FROM double_mtcars_table;
1 records
count_star()
10
Code
-- 验证不同行的计数。
SELECT count(*) FROM (
  SELECT DISTINCT * FROM double_mtcars_table
);
1 records
count_star()
10
Code
# 追加行然后删除重复项。
mtcars %>% bind_rows(mtcars) |> distinct()
                         model_name  mpg cyl  disp  hp drat    wt  qsec vs am
Mazda RX4                 Mazda RX4 21.0   6 160.0 110 3.90 2.620 16.46  0  1
Mazda RX4 Wag         Mazda RX4 Wag 21.0   6 160.0 110 3.90 2.875 17.02  0  1
Datsun 710               Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1  1
Hornet 4 Drive       Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0
Hornet Sportabout Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0
Valiant                     Valiant 18.1   6 225.0 105 2.76 3.460 20.22  1  0
Duster 360               Duster 360 14.3   8 360.0 245 3.21 3.570 15.84  0  0
Merc 240D                 Merc 240D 24.4   4 146.7  62 3.69 3.190 20.00  1  0
Merc 230                   Merc 230 22.8   4 140.8  95 3.92 3.150 22.90  1  0
Merc 280                   Merc 280 19.2   6 167.6 123 3.92 3.440 18.30  1  0
                  gear carb
Mazda RX4            4    4
Mazda RX4 Wag        4    4
Datsun 710           4    1
Hornet 4 Drive       3    1
Hornet Sportabout    3    2
Valiant              3    1
Duster 360           3    4
Merc 240D            4    2
Merc 230             4    2
Merc 280             4    4
Code
# 连接数据框然后删除重复项。
pd.concat([mtcars_pd, mtcars_pd], ignore_index=True).drop_duplicates()
          model_name   mpg  cyl   disp     hp  ...   vs   am  gear  carb  new_mpg
0          Mazda RX4  21.0  6.0  160.0  110.0  ...  0.0  1.0   4.0   4.0     22.0
1      Mazda RX4 Wag  21.0  6.0  160.0  110.0  ...  0.0  1.0   4.0   4.0     22.0
2         Datsun 710  22.8  4.0  108.0   93.0  ...  1.0  1.0   4.0   1.0     23.8
3     Hornet 4 Drive  21.4  6.0  258.0  110.0  ...  1.0  0.0   3.0   1.0     22.4
4  Hornet Sportabout  18.7  8.0  360.0  175.0  ...  0.0  0.0   3.0   2.0     19.7
5            Valiant  18.1  6.0  225.0  105.0  ...  1.0  0.0   3.0   1.0     19.1
6         Duster 360  14.3  8.0  360.0  245.0  ...  0.0  0.0   3.0   4.0     15.3
7          Merc 240D  24.4  4.0  146.7   62.0  ...  1.0  0.0   4.0   2.0     25.4
8           Merc 230  22.8  4.0  140.8   95.0  ...  1.0  0.0   4.0   2.0     23.8
9           Merc 280  19.2  6.0  167.6  123.0  ...  1.0  0.0   4.0   4.0     20.2

[10 rows x 13 columns]

15 删除行

本节介绍如何根据条件从表中删除行。

Code
-- 从表中删除特定行。
DELETE FROM mtcars_table WHERE model_name = 'Mazda RX4';
Code
-- 验证删除后的行数。
SELECT count(*) FROM mtcars_table;
1 records
count_star()
9
Code
# 筛选掉指定的行。
mtcars |> filter(model_name != 'Mazda RX4')
                         model_name  mpg cyl  disp  hp drat    wt  qsec vs am
Mazda RX4 Wag         Mazda RX4 Wag 21.0   6 160.0 110 3.90 2.875 17.02  0  1
Datsun 710               Datsun 710 22.8   4 108.0  93 3.85 2.320 18.61  1  1
Hornet 4 Drive       Hornet 4 Drive 21.4   6 258.0 110 3.08 3.215 19.44  1  0
Hornet Sportabout Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0
Valiant                     Valiant 18.1   6 225.0 105 2.76 3.460 20.22  1  0
Duster 360               Duster 360 14.3   8 360.0 245 3.21 3.570 15.84  0  0
Merc 240D                 Merc 240D 24.4   4 146.7  62 3.69 3.190 20.00  1  0
Merc 230                   Merc 230 22.8   4 140.8  95 3.92 3.150 22.90  1  0
Merc 280                   Merc 280 19.2   6 167.6 123 3.92 3.440 18.30  1  0
                  gear carb
Mazda RX4 Wag        4    4
Datsun 710           4    1
Hornet 4 Drive       3    1
Hornet Sportabout    3    2
Valiant              3    1
Duster 360           3    4
Merc 240D            4    2
Merc 230             4    2
Merc 280             4    4
Code
# 选择除指定行之外的所有行。
mtcars_pd[mtcars_pd['model_name'] != 'Mazda RX4']
                          model_name   mpg  cyl  ...  gear  carb  new_mpg
Mazda RX4 Wag          Mazda RX4 Wag  21.0  6.0  ...   4.0   4.0     22.0
Datsun 710                Datsun 710  22.8  4.0  ...   4.0   1.0     23.8
Hornet 4 Drive        Hornet 4 Drive  21.4  6.0  ...   3.0   1.0     22.4
Hornet Sportabout  Hornet Sportabout  18.7  8.0  ...   3.0   2.0     19.7
Valiant                      Valiant  18.1  6.0  ...   3.0   1.0     19.1
Duster 360                Duster 360  14.3  8.0  ...   3.0   4.0     15.3
Merc 240D                  Merc 240D  24.4  4.0  ...   4.0   2.0     25.4
Merc 230                    Merc 230  22.8  4.0  ...   4.0   2.0     23.8
Merc 280                    Merc 280  19.2  6.0  ...   4.0   4.0     20.2

[9 rows x 13 columns]
Code
mtcars_pl.filter(pl.col("model_name") != 'Mazda RX4')
shape: (9, 12)
model_name mpg cyl disp hp drat wt qsec vs am gear carb
str f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64
"Mazda RX4 Wag" 21.0 6.0 160.0 110.0 3.9 2.875 17.02 0.0 1.0 4.0 4.0
"Datsun 710" 22.8 4.0 108.0 93.0 3.85 2.32 18.61 1.0 1.0 4.0 1.0
"Hornet 4 Drive" 21.4 6.0 258.0 110.0 3.08 3.215 19.44 1.0 0.0 3.0 1.0
"Hornet Sportabout" 18.7 8.0 360.0 175.0 3.15 3.44 17.02 0.0 0.0 3.0 2.0
"Valiant" 18.1 6.0 225.0 105.0 2.76 3.46 20.22 1.0 0.0 3.0 1.0
"Duster 360" 14.3 8.0 360.0 245.0 3.21 3.57 15.84 0.0 0.0 3.0 4.0
"Merc 240D" 24.4 4.0 146.7 62.0 3.69 3.19 20.0 1.0 0.0 4.0 2.0
"Merc 230" 22.8 4.0 140.8 95.0 3.92 3.15 22.9 1.0 0.0 4.0 2.0
"Merc 280" 19.2 6.0 167.6 123.0 3.92 3.44 18.3 1.0 0.0 4.0 4.0

16 更新行

本节演示如何修改表中的现有数据。

Code
-- 选择要更新的行。
SELECT model_name, mpg FROM mtcars_table WHERE model_name = 'Mazda RX4 Wag';
1 records
model_name mpg
Mazda RX4 Wag 21
Code
-- 更新特定行的列值。
UPDATE mtcars_table
SET mpg = 999
WHERE model_name = 'Mazda RX4 Wag';
Code
-- 验证更新。
SELECT model_name, mpg FROM mtcars_table WHERE model_name = 'Mazda RX4 Wag';
1 records
model_name mpg
Mazda RX4 Wag 999
Code
# 在筛选的选择中更新值。
mtcars |> filter(model_name == 'Mazda RX4 Wag') |> mutate(mpg = 999)
                 model_name mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4 Wag Mazda RX4 Wag 999   6  160 110  3.9 2.875 17.02  0  1    4    4
Code
# 使用 .loc 更新特定值。
mtcars_pd.loc[mtcars_pd['model_name'] == 'Mazda RX4 Wag', 'mpg'] = 999
mtcars_pd
                          model_name    mpg  cyl  ...  gear  carb  new_mpg
Mazda RX4                  Mazda RX4   21.0  6.0  ...   4.0   4.0     22.0
Mazda RX4 Wag          Mazda RX4 Wag  999.0  6.0  ...   4.0   4.0     22.0
Datsun 710                Datsun 710   22.8  4.0  ...   4.0   1.0     23.8
Hornet 4 Drive        Hornet 4 Drive   21.4  6.0  ...   3.0   1.0     22.4
Hornet Sportabout  Hornet Sportabout   18.7  8.0  ...   3.0   2.0     19.7
Valiant                      Valiant   18.1  6.0  ...   3.0   1.0     19.1
Duster 360                Duster 360   14.3  8.0  ...   3.0   4.0     15.3
Merc 240D                  Merc 240D   24.4  4.0  ...   4.0   2.0     25.4
Merc 230                    Merc 230   22.8  4.0  ...   4.0   2.0     23.8
Merc 280                    Merc 280   19.2  6.0  ...   4.0   4.0     20.2

[10 rows x 13 columns]
Code
mtcars_pl.with_columns(
    pl.when(pl.col("model_name") == 'Mazda RX4 Wag')
    .then(999)
    .otherwise(pl.col("mpg"))
    .alias("mpg")
)
shape: (10, 12)
model_name mpg cyl disp hp drat wt qsec vs am gear carb
str f64 f64 f64 f64 f64 f64 f64 f64 f64 f64 f64
"Mazda RX4" 21.0 6.0 160.0 110.0 3.9 2.62 16.46 0.0 1.0 4.0 4.0
"Mazda RX4 Wag" 999.0 6.0 160.0 110.0 3.9 2.875 17.02 0.0 1.0 4.0 4.0
"Datsun 710" 22.8 4.0 108.0 93.0 3.85 2.32 18.61 1.0 1.0 4.0 1.0
"Hornet 4 Drive" 21.4 6.0 258.0 110.0 3.08 3.215 19.44 1.0 0.0 3.0 1.0
"Hornet Sportabout" 18.7 8.0 360.0 175.0 3.15 3.44 17.02 0.0 0.0 3.0 2.0
"Valiant" 18.1 6.0 225.0 105.0 2.76 3.46 20.22 1.0 0.0 3.0 1.0
"Duster 360" 14.3 8.0 360.0 245.0 3.21 3.57 15.84 0.0 0.0 3.0 4.0
"Merc 240D" 24.4 4.0 146.7 62.0 3.69 3.19 20.0 1.0 0.0 4.0 2.0
"Merc 230" 22.8 4.0 140.8 95.0 3.92 3.15 22.9 1.0 0.0 4.0 2.0
"Merc 280" 19.2 6.0 167.6 123.0 3.92 3.44 18.3 1.0 0.0 4.0 4.0

17 删除表

本节介绍如何从数据库中删除表。

删除表之前:

Code
-- 在删除一个表之前显示所有表。
SHOW ALL TABLES;
5 records
database schema name column_names column_types temporary
my-db main iris_table Sepal.Length, Sepal.Width , Petal.Length, Petal.Width , Species DOUBLE , DOUBLE , DOUBLE , DOUBLE , ENUM(‘setosa’, ‘versicolor’, ‘virginica’) FALSE
my-db main mtcars_table model_name, mpg , cyl , disp , hp , drat , wt , qsec , vs , am , gear , carb VARCHAR, DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE FALSE
my-db main new_mtcars_table_group model_name, total_mpg , cyl_mean VARCHAR, DOUBLE , DOUBLE FALSE
temp main double_mtcars_table model_name, mpg , cyl , disp , hp , drat , wt , qsec , vs , am , gear , carb VARCHAR, DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE TRUE
temp main mtcars_table_group model_name, total_mpg , cyl_mean VARCHAR, DOUBLE , DOUBLE TRUE

删除表:

Code
-- 如果存在,则删除指定的表。
DROP TABLE IF EXISTS mtcars_table_group;

删除表之后:

Code
-- 再次显示所有表以确认删除。
SHOW ALL TABLES;
4 records
database schema name column_names column_types temporary
my-db main iris_table Sepal.Length, Sepal.Width , Petal.Length, Petal.Width , Species DOUBLE , DOUBLE , DOUBLE , DOUBLE , ENUM(‘setosa’, ‘versicolor’, ‘virginica’) FALSE
my-db main mtcars_table model_name, mpg , cyl , disp , hp , drat , wt , qsec , vs , am , gear , carb VARCHAR, DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE FALSE
my-db main new_mtcars_table_group model_name, total_mpg , cyl_mean VARCHAR, DOUBLE , DOUBLE FALSE
temp main double_mtcars_table model_name, mpg , cyl , disp , hp , drat , wt , qsec , vs , am , gear , carb VARCHAR, DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE , DOUBLE TRUE

18 PIVOT (透视)

本节演示如何将数据从长格式转换为宽格式。

Code
-- 为透视演示创建一个临时表。
DROP TABLE IF EXISTS cities;
CREATE TEMP TABLE cities (
    country VARCHAR, name VARCHAR, year INTEGER, population INTEGER
);
INSERT INTO cities VALUES
    ('NL', 'Amsterdam', 2000, 1005),
    ('NL', 'Amsterdam', 2010, 1065),
    ('NL', 'Amsterdam', 2020, 1158),
    ('US', 'Seattle', 2000, 564),
    ('US', 'Seattle', 2010, 608),
    ('US', 'Seattle', 2020, 738),
    ('US', 'New York City', 2000, 8015),
    ('US', 'New York City', 2010, 8175),
    ('US', 'New York City', 2020, 8772);
Code
-- 查看原始数据。
SELECT * FROM cities;
9 records
country name year population
NL Amsterdam 2000 1005
NL Amsterdam 2010 1065
NL Amsterdam 2020 1158
US Seattle 2000 564
US Seattle 2010 608
US Seattle 2020 738
US New York City 2000 8015
US New York City 2010 8175
US New York City 2020 8772

18.1 对一列进行透视

Code
-- 对 'year' 列进行透视。
PIVOT cities
ON year
USING sum(population)
GROUP BY country;
2 records
country 2000 2010 2020
NL 1005 1065 1158
US 8579 8783 9510
Code
cities_pd.pivot_table(index='country', columns='year', values='population', aggfunc='sum').reset_index()
year country  2000  2010  2020
0         NL  1005  1065  1158
1         US  8579  8783  9510
Code
cities_pl.pivot(index='country', columns='year', values='population', aggregate_function='sum')
shape: (2, 4)
country 2000 2010 2020
str i64 i64 i64
"NL" 1005 1065 1158
"US" 8579 8783 9510

18.2 对两列进行透视

Code
-- 对 'country' 和 'name' 进行透视。
PIVOT cities
ON country, name
USING sum(population);
3 records
year NL_Amsterdam NL_New York City NL_Seattle US_Amsterdam US_New York City US_Seattle
2000 1005 NA NA NA 8015 564
2010 1065 NA NA NA 8175 608
2020 1158 NA NA NA 8772 738
Code
cities_pd.pivot_table(index=['country', 'name'], columns='year', values='population', aggfunc='sum').reset_index()
year country           name  2000  2010  2020
0         NL      Amsterdam  1005  1065  1158
1         US  New York City  8015  8175  8772
2         US        Seattle   564   608   738
Code
cities_pl.pivot(index=['country', 'name'], columns='year', values='population', aggregate_function='sum')
shape: (3, 5)
country name 2000 2010 2020
str str i64 i64 i64
"NL" "Amsterdam" 1005 1065 1158
"US" "Seattle" 564 608 738
"US" "New York City" 8015 8175 8772

19 UNPIVOT (逆透视)

本节介绍如何将数据从宽格式转换为长格式。

Code
-- 对先前透视的表进行逆透视。
UNPIVOT
(
  PIVOT cities
  ON year
  USING sum(population)
  GROUP BY country
)
ON COLUMNS(* EXCLUDE (country))
INTO
    NAME year
    VALUE population;
6 records
country year population
US 2000 8579
US 2010 8783
US 2020 9510
NL 2000 1005
NL 2010 1065
NL 2020 1158
Code
cities_pivot_pd = cities_pd.pivot_table(index='country', columns='year', values='population', aggfunc='sum').reset_index()
cities_pivot_pd.melt(id_vars='country', value_vars=[2000, 2010, 2020], var_name='year', value_name='population')
  country  year  population
0      NL  2000        1005
1      US  2000        8579
2      NL  2010        1065
3      US  2010        8783
4      NL  2020        1158
5      US  2020        9510
Code
cities_pl = pl.from_pandas(cities_pd)
Code
cities_pivot_pl = cities_pl.pivot(index='country', columns='year', values='population', aggregate_function='sum')
cities_pivot_pl.unpivot(index='country', on=['2000', '2010', '2020'], variable_name='year', value_name='population')
shape: (6, 3)
country year population
str str i64
"NL" "2000" 1005
"US" "2000" 8579
"NL" "2010" 1065
"US" "2010" 8783
"NL" "2020" 1158
"US" "2020" 9510

20 EXPLAIN (解释)

本节演示如何分析查询的执行计划。

Code
-- 显示查询的逻辑执行计划。
EXPLAIN
SELECT t1.model_name, t1.mpg, t1.cyl, t2.* FROM mtcars_table t1
INNER JOIN (SELECT * FROM mtcars_table LIMIT 5) t2 ON t1.model_name = t2.model_name;
Code
-- 显示详细的执行计划,包括计时信息。
EXPLAIN ANALYZE
SELECT t1.model_name, t1.mpg, t1.cyl, t2.* FROM mtcars_table t1
INNER JOIN (SELECT * FROM mtcars_table LIMIT 5) t2 ON t1.model_name = t2.model_name;
Code
# 断开与数据库的连接并关闭它。
dbDisconnect(con, shutdown = TRUE)

21 显示精美的表格

本节介绍如何创建格式精美的表格以供演示。

Code
# 使用 gt 库创建格式化的表格。
library(gt)
mtcars |> gt()
model_name mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Code
# 使用 great_tables 库创建格式化的表格。
from great_tables import GT
GT(mtcars_pd)
model_name mpg cyl disp hp drat wt qsec vs am gear carb new_mpg
Mazda RX4 21.0 6.0 160.0 110.0 3.9 2.62 16.46 0.0 1.0 4.0 4.0 22.0
Mazda RX4 Wag 999.0 6.0 160.0 110.0 3.9 2.875 17.02 0.0 1.0 4.0 4.0 22.0
Datsun 710 22.8 4.0 108.0 93.0 3.85 2.32 18.61 1.0 1.0 4.0 1.0 23.8
Hornet 4 Drive 21.4 6.0 258.0 110.0 3.08 3.215 19.44 1.0 0.0 3.0 1.0 22.4
Hornet Sportabout 18.7 8.0 360.0 175.0 3.15 3.44 17.02 0.0 0.0 3.0 2.0 19.7
Valiant 18.1 6.0 225.0 105.0 2.76 3.46 20.22 1.0 0.0 3.0 1.0 19.1
Duster 360 14.3 8.0 360.0 245.0 3.21 3.57 15.84 0.0 0.0 3.0 4.0 15.3
Merc 240D 24.4 4.0 146.7 62.0 3.69 3.19 20.0 1.0 0.0 4.0 2.0 25.4
Merc 230 22.8 4.0 140.8 95.0 3.92 3.15 22.9 1.0 0.0 4.0 2.0 23.8
Merc 280 19.2 6.0 167.6 123.0 3.92 3.44 18.3 1.0 0.0 4.0 4.0 20.2
Code
# 使用 great_tables 库创建格式化的表格。
from great_tables import GT
GT(mtcars_pl)
model_name mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6.0 160.0 110.0 3.9 2.62 16.46 0.0 1.0 4.0 4.0
Mazda RX4 Wag 21.0 6.0 160.0 110.0 3.9 2.875 17.02 0.0 1.0 4.0 4.0
Datsun 710 22.8 4.0 108.0 93.0 3.85 2.32 18.61 1.0 1.0 4.0 1.0
Hornet 4 Drive 21.4 6.0 258.0 110.0 3.08 3.215 19.44 1.0 0.0 3.0 1.0
Hornet Sportabout 18.7 8.0 360.0 175.0 3.15 3.44 17.02 0.0 0.0 3.0 2.0
Valiant 18.1 6.0 225.0 105.0 2.76 3.46 20.22 1.0 0.0 3.0 1.0
Duster 360 14.3 8.0 360.0 245.0 3.21 3.57 15.84 0.0 0.0 3.0 4.0
Merc 240D 24.4 4.0 146.7 62.0 3.69 3.19 20.0 1.0 0.0 4.0 2.0
Merc 230 22.8 4.0 140.8 95.0 3.92 3.15 22.9 1.0 0.0 4.0 2.0
Merc 280 19.2 6.0 167.6 123.0 3.92 3.44 18.3 1.0 0.0 4.0 4.0

22 参考资料: