In [1]: import pandas as pd
Data used for this tutorial:
  • 在本教程中,空气质量数据关于 \(NO_2\) 由以下人员使用、提供 OpenAQ 并使用 py-openaq 包裹。

    这个 air_quality_no2_long.csv 数据集提供 \(NO_2\) 测量站的值 FR04014BETR801伦敦威斯敏斯特 分别在巴黎、安特卫普和伦敦。

    To raw data
    In [2]: air_quality_no2 = pd.read_csv("data/air_quality_no2_long.csv",
       ...:                               parse_dates=True)
       ...: 
    
    In [3]: air_quality_no2 = air_quality_no2[["date.utc", "location",
       ...:                                    "parameter", "value"]]
       ...: 
    
    In [4]: air_quality_no2.head()
    Out[4]: 
                        date.utc location parameter  value
    0  2019-06-21 00:00:00+00:00  FR04014       no2   20.0
    1  2019-06-20 23:00:00+00:00  FR04014       no2   21.8
    2  2019-06-20 22:00:00+00:00  FR04014       no2   26.5
    3  2019-06-20 21:00:00+00:00  FR04014       no2   24.9
    4  2019-06-20 20:00:00+00:00  FR04014       no2   21.4
    
  • 在本教程中,使用的是有关小于2.5微米的颗粒物的空气质量数据,由 OpenAQ 并使用 py-openaq 包裹。

    这个 air_quality_pm25_long.csv 数据集提供 \(PM_{{25}}\) 测量站的值 FR04014BETR801伦敦威斯敏斯特 分别在巴黎、安特卫普和伦敦。

    To raw data
    In [5]: air_quality_pm25 = pd.read_csv("data/air_quality_pm25_long.csv",
       ...:                                parse_dates=True)
       ...: 
    
    In [6]: air_quality_pm25 = air_quality_pm25[["date.utc", "location",
       ...:                                      "parameter", "value"]]
       ...: 
    
    In [7]: air_quality_pm25.head()
    Out[7]: 
                        date.utc location parameter  value
    0  2019-06-18 06:00:00+00:00  BETR801      pm25   18.0
    1  2019-06-17 08:00:00+00:00  BETR801      pm25    6.5
    2  2019-06-17 07:00:00+00:00  BETR801      pm25   18.5
    3  2019-06-17 06:00:00+00:00  BETR801      pm25   16.0
    4  2019-06-17 05:00:00+00:00  BETR801      pm25    7.5
    

如何合并来自多个表的数据?#

连接对象#

../../_images/08_concat_row.svg
  • 我想把这些尺寸结合在一起 \(NO_2\)\(PM_{{25}}\) ,在单个表中具有相似结构的两个表。

    In [8]: air_quality = pd.concat([air_quality_pm25, air_quality_no2], axis=0)
    
    In [9]: air_quality.head()
    Out[9]: 
                        date.utc location parameter  value
    0  2019-06-18 06:00:00+00:00  BETR801      pm25   18.0
    1  2019-06-17 08:00:00+00:00  BETR801      pm25    6.5
    2  2019-06-17 07:00:00+00:00  BETR801      pm25   18.5
    3  2019-06-17 06:00:00+00:00  BETR801      pm25   16.0
    4  2019-06-17 05:00:00+00:00  BETR801      pm25    7.5
    

    这个 concat() 函数沿其中一个轴(按行或按列)执行多个表的串联操作。

默认情况下,串联沿轴0,因此结果表组合了输入表的行。让我们检查原始表和串联表的形状,以验证操作:

In [10]: print('Shape of the ``air_quality_pm25`` table: ', air_quality_pm25.shape)
Shape of the ``air_quality_pm25`` table:  (1110, 4)

In [11]: print('Shape of the ``air_quality_no2`` table: ', air_quality_no2.shape)
Shape of the ``air_quality_no2`` table:  (2068, 4)

In [12]: print('Shape of the resulting ``air_quality`` table: ', air_quality.shape)
Shape of the resulting ``air_quality`` table:  (3178, 4)

因此,结果表有3178=1110+2068行。

备注

这个 axis 参数将在许多可应用的PANA方法中返回 沿着一条轴 。一个 DataFrame 有两个对应的轴:第一个轴垂直向下横跨行(轴0),第二个轴水平横跨列(轴1)。默认情况下,像串联或汇总统计这样的大多数操作都是跨行的(轴0),但也可以跨列应用。

根据日期时间信息对表进行排序还说明了这两个表的组合,其中 parameter 定义表原点的列(任一 no2 发自表格 air_quality_no2pm25 发自表格 air_quality_pm25 ):

In [13]: air_quality = air_quality.sort_values("date.utc")

In [14]: air_quality.head()
Out[14]: 
                       date.utc            location parameter  value
2067  2019-05-07 01:00:00+00:00  London Westminster       no2   23.0
1003  2019-05-07 01:00:00+00:00             FR04014       no2   25.0
100   2019-05-07 01:00:00+00:00             BETR801      pm25   12.5
1098  2019-05-07 01:00:00+00:00             BETR801       no2   50.5
1109  2019-05-07 01:00:00+00:00  London Westminster      pm25    8.0

在此特定示例中, parameter 数据提供的列确保可以识别每个原始表。情况并不总是如此。这个 concat 函数提供了一种方便的解决方案, keys 参数,添加附加(分层)行索引。例如:

In [15]: air_quality_ = pd.concat([air_quality_pm25, air_quality_no2], keys=["PM25", "NO2"])

In [16]: air_quality_.head()
Out[16]: 
                         date.utc location parameter  value
PM25 0  2019-06-18 06:00:00+00:00  BETR801      pm25   18.0
     1  2019-06-17 08:00:00+00:00  BETR801      pm25    6.5
     2  2019-06-17 07:00:00+00:00  BETR801      pm25   18.5
     3  2019-06-17 06:00:00+00:00  BETR801      pm25   16.0
     4  2019-06-17 05:00:00+00:00  BETR801      pm25    7.5

备注

这些教程中没有提到同时存在多个行/列索引。 层次化索引MultiIndex 是Pandas分析高维数据的一项先进而强大的功能。

多索引不在Pandas介绍的范围之内。现在,请记住该函数 reset_index 可用于将索引的任何级别转换为列,例如 air_quality.reset_index(level=0)

To user guide

您可以在上的用户指南部分自由探索多索引的世界 advanced indexing

To user guide

有关表连接(按行和列)以及如何连接的更多选项 concat 可用于定义其他轴上的索引的逻辑(并集或交集)在上的部分提供 object concatenation

使用公共标识符联接表#

../../_images/08_merge_left.svg
  • 将桩号元数据表提供的桩号坐标添加到测量表中的相应行。

    警告

    空气质量测量站坐标存储在数据文件中 air_quality_stations.csv, downloaded using the py-openaq 包裹。

    In [17]: stations_coord = pd.read_csv("data/air_quality_stations.csv")
    
    In [18]: stations_coord.head()
    Out[18]: 
      location  coordinates.latitude  coordinates.longitude
    0  BELAL01              51.23619                4.38522
    1  BELHB23              51.17030                4.34100
    2  BELLD01              51.10998                5.00486
    3  BELLD02              51.12038                5.02155
    4  BELR833              51.32766                4.36226
    

    备注

    本例中使用的电台(FR04014、BETR801和London Westminster)只是元数据表中登记的三个条目。我们只想将这三个元素的坐标添加到度量表中,每个都位于 air_quality 桌子。

    In [19]: air_quality.head()
    Out[19]: 
                           date.utc            location parameter  value
    2067  2019-05-07 01:00:00+00:00  London Westminster       no2   23.0
    1003  2019-05-07 01:00:00+00:00             FR04014       no2   25.0
    100   2019-05-07 01:00:00+00:00             BETR801      pm25   12.5
    1098  2019-05-07 01:00:00+00:00             BETR801       no2   50.5
    1109  2019-05-07 01:00:00+00:00  London Westminster      pm25    8.0
    
    In [20]: air_quality = pd.merge(air_quality, stations_coord, how="left", on="location")
    
    In [21]: air_quality.head()
    Out[21]: 
                        date.utc            location parameter  value  coordinates.latitude  coordinates.longitude
    0  2019-05-07 01:00:00+00:00  London Westminster       no2   23.0              51.49467               -0.13193
    1  2019-05-07 01:00:00+00:00             FR04014       no2   25.0              48.83724                2.39390
    2  2019-05-07 01:00:00+00:00             FR04014       no2   25.0              48.83722                2.39390
    3  2019-05-07 01:00:00+00:00             BETR801      pm25   12.5              51.20966                4.43182
    4  2019-05-07 01:00:00+00:00             BETR801       no2   50.5              51.20966                4.43182
    

    使用 merge() 函数中的每一行 air_quality 表中,相应的坐标将从 air_quality_stations_coord 桌子。两个表都有一列 location 共同用作组合信息的关键字。通过选择 left 加入,只有在 air_quality (左)表,即FR04014、BETR801和伦敦威斯敏斯特,最终出现在结果表中。这个 merge 函数支持类似于数据库式操作的多个联接选项。

  • 将参数元数据表提供的参数的完整描述和名称添加到测量表中。

    警告

    空气质量参数元数据存储在数据文件中 air_quality_parameters.csv, downloaded using the py-openaq 包裹。

    In [22]: air_quality_parameters = pd.read_csv("data/air_quality_parameters.csv")
    
    In [23]: air_quality_parameters.head()
    Out[23]: 
         id                                        description  name
    0    bc                                       Black Carbon    BC
    1    co                                    Carbon Monoxide    CO
    2   no2                                   Nitrogen Dioxide   NO2
    3    o3                                              Ozone    O3
    4  pm10  Particulate matter less than 10 micrometers in...  PM10
    
    In [24]: air_quality = pd.merge(air_quality, air_quality_parameters,
       ....:                        how='left', left_on='parameter', right_on='id')
       ....: 
    
    In [25]: air_quality.head()
    Out[25]: 
                        date.utc            location parameter  value  coordinates.latitude  coordinates.longitude    id                                        description   name
    0  2019-05-07 01:00:00+00:00  London Westminster       no2   23.0              51.49467               -0.13193   no2                                   Nitrogen Dioxide    NO2
    1  2019-05-07 01:00:00+00:00             FR04014       no2   25.0              48.83724                2.39390   no2                                   Nitrogen Dioxide    NO2
    2  2019-05-07 01:00:00+00:00             FR04014       no2   25.0              48.83722                2.39390   no2                                   Nitrogen Dioxide    NO2
    3  2019-05-07 01:00:00+00:00             BETR801      pm25   12.5              51.20966                4.43182  pm25  Particulate matter less than 2.5 micrometers i...  PM2.5
    4  2019-05-07 01:00:00+00:00             BETR801       no2   50.5              51.20966                4.43182   no2                                   Nitrogen Dioxide    NO2
    

    与前面的示例相比,没有通用的列名。然而, parameter 列中的 air_quality 表和 id 列中的 air_quality_parameters_name 两者都以一种通用格式提供测量变量。这个 left_onright_on 此处使用的是参数(而不是 on )在两个表之间建立链接。

To user guide

Pandas也支持内、外和右连接。上的用户指南部分提供了有关表的联接/合并的更多信息 database style merging of tables 。或者看一看 comparison with SQL 佩奇。

REMEMBER

  • 属性可以按列和按行连接多个表。 concat 功能。

  • 对于类似于数据库的表合并/联接,请使用 merge 功能。

To user guide

请参阅用户指南,了解各种 facilities to combine data tables