In [1]: import pandas as pd
-
空氣品質硝酸鹽資料
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
-
空氣品質懸浮微粒資料
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
如何結合多個表格中的資料#
串接物件#
我想結合結構相似的兩個表格中,\(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_no2
或 pm25
來自表格 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
定義其他軸上索引的邏輯 (聯集或交集),請參閱 物件串接 部分。
使用共通識別碼加入表格#
將由 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_on
和right_on
參數(而非僅使用on
)來建立兩個表格之間的連結。
請記住
可以使用
concat
函數,以欄位方式和列方式串接多個表格。若要進行資料庫式的表格合併/連接,請使用
merge
函數。
請參閱使用者指南,以取得各種 資料表格結合功能 的完整說明。