In [1]: import pandas as pd
本教程使用的数据
  • 本教程使用由 OpenAQ 提供并使用 py-openaq 包下载的关于 \(NO_2\) 的空气质量数据。

    air_quality_no2_long.csv 数据集分别提供了巴黎、安特卫普和伦敦的测量站 FR04014BETR801London Westminster\(NO_2\) 值。

    原始数据
    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
    
  • 在本教程中,我们使用来自 OpenAQ 的空气质量数据,这些数据是关于小于 2.5 微米的颗粒物的,并使用 py-openaq 包下载的。

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

    原始数据
    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
    

    The 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 行。

注意

The axis 参数将在许多可以沿着轴应用的 pandas 方法中返回。一个 DataFrame 有两个相应的轴:第一个沿着行垂直向下(轴 0),第二个沿着列水平(轴 1)。大多数操作,如连接或汇总统计,默认情况下是沿着行(轴 0)进行的,但也可以沿着列进行。

根据日期时间信息对表格进行排序,也说明了两个表格的组合,其中 parameter 列定义了表格的来源(无论是来自表格 air_quality_no2no2 还是来自表格 air_quality_pm25pm25

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

注意

这些教程中没有提到同时存在多个行/列索引的情况。分层索引多级索引是 pandas 的一个高级且强大的功能,用于分析更高维度的數據。

多级索引超出了本 pandas 入门的范围。目前,请记住,函数 reset_index 可用于将索引的任何级别转换为列,例如 air_quality.reset_index(level=0)

到用户指南

欢迎您在用户指南的 高级索引 部分深入了解多级索引的世界。

到用户指南

有关表格连接(行和列方向)以及如何使用 concat 来定义其他轴上索引的逻辑(并集或交集)的更多选项,请参见 对象连接 部分。

使用公共标识符连接表格#

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

    警告

    空气质量测量站坐标存储在数据文件 air_quality_stations.csv 中,该文件使用 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 和伦敦威斯敏斯特)只是元数据表中列出的三个条目。我们只想将这三个站点的坐标添加到测量表中,每个站点对应于 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  ... coordinates.longitude
    0  2019-05-07 01:00:00+00:00  ...              -0.13193
    1  2019-05-07 01:00:00+00:00  ...               2.39390
    2  2019-05-07 01:00:00+00:00  ...               2.39390
    3  2019-05-07 01:00:00+00:00  ...               4.43182
    4  2019-05-07 01:00:00+00:00  ...               4.43182
    
    [5 rows x 6 columns]
    

    使用 merge() 函数,对于 air_quality 表中的每一行,都会从 air_quality_stations_coord 表中添加相应的坐标。这两个表都有一个共同的列 location,它用作组合信息的键。通过选择 left 连接,只有 air_quality(左)表中可用的位置,即 FR04014、BETR801 和伦敦威斯敏斯特,最终会出现在结果表中。 merge 函数支持多种连接选项,类似于数据库风格的操作。

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

    警告

    空气质量参数元数据存储在一个名为 air_quality_parameters.csv 的数据文件中,该文件使用 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  ...   name
    0  2019-05-07 01:00:00+00:00  ...    NO2
    1  2019-05-07 01:00:00+00:00  ...    NO2
    2  2019-05-07 01:00:00+00:00  ...    NO2
    3  2019-05-07 01:00:00+00:00  ...  PM2.5
    4  2019-05-07 01:00:00+00:00  ...    NO2
    
    [5 rows x 9 columns]
    

    与之前的示例相比,没有共同的列名。但是, air_quality 表中的 parameter 列和 air_quality_parameters_name 表中的 id 列都以通用格式提供测量变量。这里使用 left_onright_on 参数(而不是仅使用 on)来建立两个表之间的链接。

到用户指南

pandas 还支持内部、外部和右连接。有关表连接/合并的更多信息,请参阅用户指南中关于 数据库风格的表合并 的部分。或者查看 与 SQL 的比较 页面。

记住

  • 可以使用 concat 函数将多个表格按列或按行连接。

  • 对于类似数据库的表格合并/连接,请使用 merge 函数。

到用户指南

有关各种 组合数据表格的方法 的完整描述,请参阅用户指南。