• 数据分析大作战,SQL V.S. Python,来看看这些考题你都会吗 ⛵


    💡 作者:韩信子@ShowMeAI
    📘 数据分析实战系列https://www.showmeai.tech/tutorials/40
    📘 本文地址https://www.showmeai.tech/article-detail/314
    📢 声明:版权所有,转载请联系平台与作者并注明出处
    📢 收藏ShowMeAI查看更多精彩内容

    对于数据分析师、数据科学家等数据从业人员来说,我们有很多的工具可以帮助我们探索与分析数据,发现数据之下的分布与模式规律,最常见和实用的技能是使用 SQL 和 Python 进行数据分析。SQL 和 Python 进行数据分析各有优势:

    • SQL 支持很多数据库(如 MS SQL、MySQL、SQLite、PostgreSQL等),可以很方便跨数据库使用,而且无需编程语言基础,可以快速上手。
    • Python 数据分析(这里指的使用 Pandas 工具库)比较灵活,可以进行数据清理、清洗、格式变化、复杂计算等,还支持很好的可视化,并能无缝衔接后续进一步深入挖掘与建模等流程。

    但在大部分需求与功能上,SQL 和 Pandas 都是可以完成的,在本篇内容中,ShowMeAI就帮大家把所有的核心数据分析功能梳理处理,并用 SQL 和 Pandas 进行实现,我们可以轻松对比学习

    对于 Python 数据分析和 SQL 更详尽的内容,欢迎大家查阅ShowMeAI制作的系列教程和速查表:

    💡 场景&数据集

    我们这里使用到的是 🏆mtcars数据集,它是一份1974年摩托风尚杂志的数据(1974 Motor Trend Magazine),你可以在这里下载到csv文本格式的文件,能够导入数据库的db格式文件可以在这里下载。

    🏆 实战数据集下载(百度网盘):公众号『ShowMeAI研究中心』回复『实战』,或者点击 这里 获取本文 [21]SQL与Pandas数据分析实操大全mtcars数据集

    ShowMeAI官方GitHubhttps://github.com/ShowMeAI-Hub

    我们先用python对数据进行读取,读取为pandas dataframe格式。

    import numpy as np
    import pandas as pd
    
    
    mtcars_df = pd.read_csv("mtcars.csv")
    
    • 1
    • 2
    • 3
    • 4
    • 5

    下面我们梳理一下数据分析中会使用到的核心技能,并对比SQL和Pandas分别是如何实现这些功能的。

    💡 数据选择

    有时我们需要返回数据集的列(字段)子集。 例如,我们要从 mtcars数据集中选择 Miles/(US) 加仑 ( mpg), 气缸数( cyl) 和总马力 ( hp)这几个字段对应的数据。

    📌 SQL

    我们使用标准的SELECT语句就可以完成数据选择。

    SELECT 
          mpg, 
          disp, 
          cyl 
    FROM mtcars
    
    
    ##     mpg  disp cyl
    ## 1  21.0 160.0   6
    ## 2  21.0 160.0   6
    ## 3  22.8 108.0   4
    .
    .
    .
    ## 30 19.7 145.0   6
    ## 31 15.0 301.0   8
    ## 32 21.4 121.0   4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    📌 Pandas

    我们直接把字段子集的列表给到 dataframe 即可取出对应的数据子集。

    mtcars_df[['mpg', 'disp', 'cyl']]
    ##      mpg   disp  cyl
    ## 0   21.0  160.0    6
    ## 1   21.0  160.0    6
    ## 2   22.8  108.0    4
    .
    .
    .
    ## 29  19.7  145.0    6
    ## 30  15.0  301.0    8
    ## 31  21.4  121.0    4
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    💡 限制

    有时候我们希望提前查看一下数据集,但是在总体数据集很大的情况下,我们不能查看所有数据,我们会做一个限制,比如查看数据的前 5 行对表的结构和数据类型进行一个速览。

    📌 SQL

    SQL有 LIMIT n语法可以限制与返回数据前n行。

    SELECT * 
    FROM mtcars 
      LIMIT 5;
      
    
    ##    mpg cyl disp  hp drat    wt  qsec vs am gear carb             model
    ## 1 21.0   6  160 110 3.90 2.620 16.46  0  1    4    4         Mazda RX4
    ## 2 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4     Mazda RX4 Wag
    ## 3 22.8   4  108  93 3.85 2.320 18.61  1  1    4    1        Datsun 710
    ## 4 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1    Hornet 4 Drive
    ## 5 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2 Hornet Sportabout
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    📌 Pandas

    Pandas通过df.head(n = 5)的参数传入来返回头部5

    mtcars_df.head(n = 5)
    ##     mpg  cyl   disp   hp  drat  ...  vs  am  gear  carb              model
    ## 0  21.0    6  160.0  110  3.90  ...   0   1     4     4          Mazda RX4
    ## 1  21.0    6  160.0  110  3.90  ...   0   1     4     4      Mazda RX4 Wag
    ## 2  22.8    4  108.0   93  3.85  ...   1   1     4     1         Datsun 710
    ## 3  21.4    6  258.0  110  3.08  ...   1   0     3     1     Hornet 4 Drive
    ## 4  18.7    8  360.0  175  3.15  ...   0   0     3     2  Hornet Sportabout
    ## 
    ## [5 rows x 12 columns]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    💡 统计计数

    如果我们要对数据进行统计计数,SQL 和 Pandas 的实现方式也不太一样。

    📌 SQL

    SQL通过count(*)语法返回数据集的计数(例如下面是总行数)。

    SELECT COUNT(*) 
    FROM 
      mtcars LIMIT 5;
      
    ##   COUNT(*)
    ## 1       32
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    📌 Pandas

    Pandas dataframe 有一个属性 shape,它返回数据集中的行数和列数。

    nrows, ncols = mtcars_df.shape
    print("Number of Rows: ", nrows)
    ## Number of Rows:  32
    
    • 1
    • 2
    • 3

    💡 排序

    在 SQL 和 Pandas 中,我们可以根据一列或多列的值对数据进行升序或降序排列。

    📌 SQL

    SQL通过ORDER BY来对数据进行排序,默认升序。

    SELECT * 
    FROM mtcars 
      ORDER BY mpg 
      LIMIT 5;
      
    ##    mpg cyl disp  hp drat    wt  qsec vs am gear carb               model
    ## 1 10.4   8  472 205 2.93 5.250 17.98  0  0    3    4  Cadillac Fleetwood
    ## 2 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4 Lincoln Continental
    ## 3 13.3   8  350 245 3.73 3.840 15.41  0  0    3    4          Camaro Z28
    ## 4 14.3   8  360 245 3.21 3.570 15.84  0  0    3    4          Duster 360
    ## 5 14.7   8  440 230 3.23 5.345 17.42  0  0    3    4   Chrysler Imperial
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    我们也可以指定降序排列( DESC)。

    SELECT * 
    FROM mtcars 
      ORDER BY mpg DESC
      LIMIT 5;
      
    ##    mpg cyl disp  hp drat    wt  qsec vs am gear carb          model
    ## 1 33.9   4 71.1  65 4.22 1.835 19.90  1  1    4    1 Toyota Corolla
    ## 2 32.4   4 78.7  66 4.08 2.200 19.47  1  1    4    1       Fiat 128
    ## 3 30.4   4 75.7  52 4.93 1.615 18.52  1  1    4    2    Honda Civic
    ## 4 30.4   4 95.1 113 3.77 1.513 16.90  1  1    5    2   Lotus Europa
    ## 5 27.3   4 79.0  66 4.08 1.935 18.90  1  1    4    1      Fiat X1-9
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    我们也可以同时指定按照某些列升序,某些列降序进行排序,例如下面我们按照mpg升序和model降序对数据排列。

    SELECT * 
    FROM mtcars 
      ORDER BY mpg ASC, model DESC 
      LIMIT 5;
      
    
    ##    mpg cyl disp  hp drat    wt  qsec vs am gear carb               model
    ## 1 10.4   8  460 215 3.00 5.424 17.82  0  0    3    4 Lincoln Continental
    ## 2 10.4   8  472 205 2.93 5.250 17.98  0  0    3    4  Cadillac Fleetwood
    ## 3 13.3   8  350 245 3.73 3.840 15.41  0  0    3    4          Camaro Z28
    ## 4 14.3   8  360 245 3.21 3.570 15.84  0  0    3    4          Duster 360
    ## 5 14.7   8  440 230 3.23 5.345 17.42  0  0    3    4   Chrysler Imperial
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    📌 Pandas

    Pandas中的sort_values函数可以完成排序。

    mtcars_df.sort_values(by = 'mpg').head(n = 5)
    ##      mpg  cyl   disp   hp  drat  ...  vs  am  gear  carb                model
    ## 15  10.4    8  460.0  215  3.00  ...   0   0     3     4  Lincoln Continental
    ## 14  10.4    8  472.0  205  2.93  ...   0   0     3     4   Cadillac Fleetwood
    ## 23  13.3    8  350.0  245  3.73  ...   0   0     3     4           Camaro Z28
    ## 6   14.3    8  360.0  245  3.21  ...   0   0     3     4           Duster 360
    ## 16  14.7    8  440.0  230  3.23  ...   0   0     3     4    Chrysler Imperial
    ## 
    ## [5 rows x 12 columns]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    我们可以在sort_values函数中指定排序字段和方式。

    mtcars_df.sort_values(by = 'mpg', ascending=False).head(n = 5)
    ##      mpg  cyl  disp   hp  drat  ...  vs  am  gear  carb           model
    ## 19  33.9    4  71.1   65  4.22  ...   1   1     4     1  Toyota Corolla
    ## 17  32.4    4  78.7   66  4.08  ...   1   1     4     1        Fiat 128
    ## 27  30.4    4  95.1  113  3.77  ...   1   1     5     2    Lotus Europa
    ## 18  30.4    4  75.7   52  4.93  ...   1   1     4     2     Honda Civic
    ## 25  27.3    4  79.0   66  4.08  ...   1   1     4     1       Fiat X1-9
    ## 
    ## [5 rows x 12 columns]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    当我们要对多个字段排序并指定不同的规则时,只要在sort_values中传入对应的字段和排序规则列表即可。

    mtcars_df.sort_values(by = ['mpg', 'model'], ascending=[True, False]).head(n = 5)
    ##      mpg  cyl   disp   hp  drat  ...  vs  am  gear  carb                model
    ## 15  10.4    8  460.0  215  3.00  ...   0   0     3     4  Lincoln Continental
    ## 14  10.4    8  472.0  205  2.93  ...   0   0     3     4   Cadillac Fleetwood
    ## 23  13.3    8  350.0  245  3.73  ...   0   0     3     4           Camaro Z28
    ## 6   14.3    8  360.0  245  3.21  ...   0   0     3     4           Duster 360
    ## 16  14.7    8  440.0  230  3.23  ...   0   0     3     4    Chrysler Imperial
    ## 
    ## [5 rows x 12 columns]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    💡 新字段生成

    假如我们要基于目前已有字段mpgwt创建两个新列 kg-per-gallon kplwt_kg,计算后保留小数点后两位,那 SQL 和 Pandas 的计算方式分别如下:

    📌 SQL

    我们通过SELECT可以直接构建新的字段与重命名,SQL 中也支持用ROUND函数对数值精度进行控制。

    SELECT ROUND(mpg*1.60934, 2) AS kpg,
           ROUND(wt*1000*0.453592, 2) AS wt_kg
    FROM mtcars LIMIT 5;
    
    ##     kpg   wt_kg
    ## 1 33.80 1188.41
    ## 2 33.80 1304.08
    ## 3 36.69 1052.33
    ## 4 34.44 1458.30
    ## 5 30.09 1560.36
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    📌 Pandas

    Pandas 创建新字段也非常简单,对于数值进行精度控制需要借助 numpy 和 round 函数。

    mtcars_df['kpg'] = np.round(mtcars_df['mpg']*1.60934, 2)
    mtcars_df['wt_kg'] = np.round(mtcars_df['wt']*1000*0.453592, 2)
    mtcars_df[['kpg', 'wt_kg']].head(n = 5)
    
    ##      kpg    wt_kg
    ## 0  33.80  1188.41
    ## 1  33.80  1304.08
    ## 2  36.69  1052.33
    ## 3  34.44  1458.30
    ## 4  30.09  1560.36
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    💡 数据选择

    我们经常需要对数据进行条件选择,SQL 中会通过WHERE语句来进行条件选择,而在 Pandas 中我们可以直接在 dataframe 后添加单一或组合条件来进行数据选择。具体示例如下:

    📌 SQL

    从 mtcars 数据集中选择档位为4(gear为4)的汽车如下

    SELECT * 
    FROM mtcars 
      WHERE gear = 4;
    
    ##     mpg cyl  disp  hp drat    wt  qsec vs am gear carb          model
    ## 1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4      Mazda RX4
    ## 2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4  Mazda RX4 Wag
    ## 3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1     Datsun 710
    ## 4  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2      Merc 240D
    ## 5  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2       Merc 230
    ## 6  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4       Merc 280
    ## 7  17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4      Merc 280C
    ## 8  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1       Fiat 128
    ## 9  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2    Honda Civic
    ## 10 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1 Toyota Corolla
    ## 11 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1      Fiat X1-9
    ## 12 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2     Volvo 142E
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    如果我们需要使用组合条件,比如选择gear为4以及气缸数 cyl小于或等于 6的数据,那在where 语句中我们可以用AND等进行条件组合:

    SELECT * 
    FROM mtcars 
      WHERE gear = 4 AND cyl <= 6;
    
    ##     mpg cyl  disp  hp drat    wt  qsec vs am gear carb          model
    ## 1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4      Mazda RX4
    ## 2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4  Mazda RX4 Wag
    ## 3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1     Datsun 710
    ## 4  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2      Merc 240D
    ## 5  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2       Merc 230
    ## 6  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4       Merc 280
    ## 7  17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4      Merc 280C
    ## 8  32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1       Fiat 128
    ## 9  30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2    Honda Civic
    ## 10 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1 Toyota Corolla
    ## 11 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1      Fiat X1-9
    ## 12 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2     Volvo 142E
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    如果上面两个条件不是且关系,而是满足任何一个都可以,那我们把条件组合方式换成OR

    SELECT * 
    FROM mtcars 
      WHERE gear = 4 OR cyl <= 6;
    
    ##     mpg cyl  disp  hp drat    wt  qsec vs am gear carb          model
    ## 1  21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4      Mazda RX4
    ## 2  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4  Mazda RX4 Wag
    ## 3  22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1     Datsun 710
    ## 4  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1 Hornet 4 Drive
    ## 5  18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1        Valiant
    ## 6  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2      Merc 240D
    ## 7  22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2       Merc 230
    ## 8  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4       Merc 280
    ## 9  17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4      Merc 280C
    ## 10 32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1       Fiat 128
    ## 11 30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2    Honda Civic
    ## 12 33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1 Toyota Corolla
    ## 13 21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1  Toyota Corona
    ## 14 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1      Fiat X1-9
    ## 15 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2  Porsche 914-2
    ## 16 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2   Lotus Europa
    ## 17 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6   Ferrari Dino
    ## 18 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2     Volvo 142E
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    📌 Pandas

    mtcars中返回gear == 4的数据

    mtcars_df[mtcars_df.gear == 4]
    ##      mpg  cyl   disp   hp  drat  ...  gear  carb           model    kpg    wt_kg
    ## 0   21.0    6  160.0  110  3.90  ...     4     4       Mazda RX4  33.80  1188.41
    ## 1   21.0    6  160.0  110  3.90  ...     4     4   Mazda RX4 Wag  33.80  1304.08
    ## 2   22.8    4  108.0   93  3.85  ...     4     1      Datsun 710  36.69  1052.33
    ## 7   24.4    4  146.7   62  3.69  ...     4     2       Merc 240D  39.27  1446.96
    ## 8   22.8    4  140.8   95  3.92  ...     4     2        Merc 230  36.69  1428.81
    ## 9   19.2    6  167.6  123  3.92  ...     4     4        Merc 280  30.90  1560.36
    ## 10  17.8    6  167.6  123  3.92  ...     4     4       Merc 280C  28.65  1560.36
    ## 17  32.4    4   78.7   66  4.08  ...     4     1        Fiat 128  52.14   997.90
    ## 18  30.4    4   75.7   52  4.93  ...     4     2     Honda Civic  48.92   732.55
    ## 19  33.9    4   71.1   65  4.22  ...     4     1  Toyota Corolla  54.56   832.34
    ## 25  27.3    4   79.0   66  4.08  ...     4     1       Fiat X1-9  43.93   877.70
    ## 31  21.4    4  121.0  109  4.11  ...     4     2      Volvo 142E  34.44  1260.99
    ## 
    ## [12 rows x 14 columns]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    如果要求 gear == 4 以及 cyl <= 6,那 Pandas 写法如下:

    mtcars_df[(mtcars_df.gear == 4) & (mtcars_df.cyl <= 6)]
    ##      mpg  cyl   disp   hp  drat  ...  gear  carb           model    kpg    wt_kg
    ## 0   21.0    6  160.0  110  3.90  ...     4     4       Mazda RX4  33.80  1188.41
    ## 1   21.0    6  160.0  110  3.90  ...     4     4   Mazda RX4 Wag  33.80  1304.08
    ## 2   22.8    4  108.0   93  3.85  ...     4     1      Datsun 710  36.69  1052.33
    ## 7   24.4    4  146.7   62  3.69  ...     4     2       Merc 240D  39.27  1446.96
    ## 8   22.8    4  140.8   95  3.92  ...     4     2        Merc 230  36.69  1428.81
    ## 9   19.2    6  167.6  123  3.92  ...     4     4        Merc 280  30.90  1560.36
    ## 10  17.8    6  167.6  123  3.92  ...     4     4       Merc 280C  28.65  1560.36
    ## 17  32.4    4   78.7   66  4.08  ...     4     1        Fiat 128  52.14   997.90
    ## 18  30.4    4   75.7   52  4.93  ...     4     2     Honda Civic  48.92   732.55
    ## 19  33.9    4   71.1   65  4.22  ...     4     1  Toyota Corolla  54.56   832.34
    ## 25  27.3    4   79.0   66  4.08  ...     4     1       Fiat X1-9  43.93   877.70
    ## 31  21.4    4  121.0  109  4.11  ...     4     2      Volvo 142E  34.44  1260.99
    ## 
    ## [12 rows x 14 columns]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    如果要求 gear == 4cyl <= 6,那 Pandas 写法如下:

    mtcars_df[(mtcars_df.gear == 4) | (mtcars_df.cyl <= 6)]
    ##      mpg  cyl   disp   hp  drat  ...  gear  carb           model    kpg    wt_kg
    ## 0   21.0    6  160.0  110  3.90  ...     4     4       Mazda RX4  33.80  1188.41
    ## 1   21.0    6  160.0  110  3.90  ...     4     4   Mazda RX4 Wag  33.80  1304.08
    ## 2   22.8    4  108.0   93  3.85  ...     4     1      Datsun 710  36.69  1052.33
    ## 3   21.4    6  258.0  110  3.08  ...     3     1  Hornet 4 Drive  34.44  1458.30
    ## 5   18.1    6  225.0  105  2.76  ...     3     1         Valiant  29.13  1569.43
    ## 7   24.4    4  146.7   62  3.69  ...     4     2       Merc 240D  39.27  1446.96
    ## 8   22.8    4  140.8   95  3.92  ...     4     2        Merc 230  36.69  1428.81
    ## 9   19.2    6  167.6  123  3.92  ...     4     4        Merc 280  30.90  1560.36
    ## 10  17.8    6  167.6  123  3.92  ...     4     4       Merc 280C  28.65  1560.36
    ## 17  32.4    4   78.7   66  4.08  ...     4     1        Fiat 128  52.14   997.90
    ## 18  30.4    4   75.7   52  4.93  ...     4     2     Honda Civic  48.92   732.55
    ## 19  33.9    4   71.1   65  4.22  ...     4     1  Toyota Corolla  54.56   832.34
    ## 20  21.5    4  120.1   97  3.70  ...     3     1   Toyota Corona  34.60  1118.10
    ## 25  27.3    4   79.0   66  4.08  ...     4     1       Fiat X1-9  43.93   877.70
    ## 26  26.0    4  120.3   91  4.43  ...     5     2   Porsche 914-2  41.84   970.69
    ## 27  30.4    4   95.1  113  3.77  ...     5     2    Lotus Europa  48.92   686.28
    ## 29  19.7    6  145.0  175  3.62  ...     5     6    Ferrari Dino  31.70  1256.45
    ## 31  21.4    4  121.0  109  4.11  ...     4     2      Volvo 142E  34.44  1260.99
    ## 
    ## [18 rows x 14 columns]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    💡 数据分组

    我们对数据进行分析,分组和按组统计是最重要的核心功能,我们来看看 SQL 和 Pandas 都分别如何对数据分组:

    📌 SQL

    在 SQL 中可以借助于GROUP BY语句对数据进行分组,例如下面是我们基于 gear 字段进行数据分组。

    SELECT 
        gear, 
        COUNT(*) 
        FROM mtcars 
            GROUP BY gear;
            
    ##   gear COUNT(*)
    ## 1    3       15
    ## 2    4       12
    ## 3    5        5
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Pandas 中可以直接对 dataframe 使用 groupby 函数进行数据分组,如下:

    📌 Pandas

    mtcars_df.groupby("gear").count()['model']
    ## gear
    ## 3    15
    ## 4    12
    ## 5     5
    ## Name: model, dtype: int64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    💡 统计均值

    非常常见的统计任务之一是对数据进行均值统计,对应的 SQL 和 Pandas 操作如下:

    📌 SQL

    SELECT 
        AVG(wt), 
        AVG(hp), 
        AVG(mpg) 
    FROM mtcars;
    
    ##   AVG(wt)  AVG(hp) AVG(mpg)
    ## 1 3.21725 146.6875 20.09062
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    📌 Pandas

    mtcars_df[['wt', 'hp', 'mpg']].mean()
    
    ## wt       3.217250
    ## hp     146.687500
    ## mpg     20.090625
    ## dtype: float64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    💡 方差

    对于方差而言,SQL 和 Pandas 的计算方式如下:

    📌 SQL

    SELECT AVG(wt*wt) - AVG(wt)*AVG(wt) AS WT,
            AVG(hp*hp) - AVG(hp)*AVG(hp) AS HP,
            AVG(mpg*mpg) - AVG(mpg)*AVG(mpg) AS MPG 
    FROM mtcars;
    
    ##          WT       HP      MPG
    ## 1 0.9274609 4553.965 35.18897
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    📌 Pandas

    mtcars_df[['wt', 'hp', 'mpg']].var(ddof=0)
    
    ## wt        0.927461
    ## hp     4553.964844
    ## mpg      35.188975
    ## dtype: float64
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    💡 极差/范围

    另外一个常用统计量是极差(最大值 - 最小值),SQL 和 Pandas 的做法如下:

    📌 SQL

    SELECT min(gear) AS MIN,
               max(gear) AS MAX, 
               sum(gear) AS TOTAL,
               max(gear)-min(gear) AS RANGE
    FROM mtcars;
    
    ##   MIN MAX TOTAL RANGE
    ## 1   3   5   118     2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    📌 Pandas

    # Min
    mtcars_df['gear'].min()
    ## 3
    
    
    #Max
    mtcars_df['gear'].max()
    ## 5
    
    
    #Total
    mtcars_df['gear'].sum()
    ## 118
    
    
    #Range
    mtcars_df['gear'].max() - mtcars_df['gear'].min()
    ## 2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    💡 总结

    在本篇中,ShowMeAI将使用 SQL 和 Python(Pandas 工具库)进行数据分析做了梳理和对比,两个都是非常常见的工具和方式,大家可以对比学习掌握后灵活使用。

    参考资料

  • 相关阅读:
    关于白盒测试,这些技巧你得游刃有余~
    vue3获取元素并修改元素样式
    【R】数据相关性的可视化
    微信小程序的无限瀑布流写法
    服务网关之Spring Cloud Gateway
    ES6原生组件在页面频繁操作,导致页面崩溃,内存使用无异常。记一次奇葩BUG导致的页面崩溃
    【开发篇】七、RedisTemplate与StringRedisTemplate + Jedis与Lettcus
    搭建知识库系统不难,选对工具很重要!
    【Java集合框架】14——LinkedHashSet 类
    伊顿将在汉诺威国际商用车展上重点推介可持续商用车技术
  • 原文地址:https://blog.csdn.net/ShowMeAI/article/details/126492921