In [1]: import pandas as pd
本教學課程使用的資料
  • 本教學課程使用 OpenAQ 提供的 \(NO_2\) 空氣品質資料,並使用 py-openaq 套件下載。

    air_quality_no2_long.csv 資料集提供巴黎的 FR04014、安特衛普的 BETR801 和倫敦的 London 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 套件下載。

    air_quality_pm25_long.csv 資料集提供巴黎的 FR04014、安特衛普的 BETR801 和倫敦的 London Westminster 等測量站的 \(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
    

    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 參數會回傳在許多可以沿著軸線應用的 pandas 方法中。一個 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

注意

這些教學課程中尚未提到同時存在多個列/欄索引的情況。階層式索引多重索引 是進階且強大的 pandas 功能,用於分析更高維度的資料。

多重索引不在本 pandas 簡介的範圍內。目前,請記住函數 reset_index 可用於將索引的任何層級轉換為欄位,例如 air_quality.reset_index(level=0)

至使用者指南

歡迎在使用者指南的 進階索引 部分深入了解多重索引的世界。

至使用者指南

關於表格串接 (列和欄位) 的更多選項,以及如何使用 concat 定義其他軸上索引的邏輯 (聯集或交集),請參閱 物件串接 部分。

使用共通識別碼加入表格#

../../_images/08_merge_left.svg
  • 將由 stations 元資料表格提供的測站座標新增至測量值表格中對應的列。

    警告

    空氣品質測量站座標儲存在資料檔案 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 函數。

至使用者指南

請參閱使用者指南,以取得各種 資料表格結合功能 的完整說明。