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
複数のテーブルからデータを結合する方法#
オブジェクトの連結#
類似の構造を持つ2つのテーブルである \(NO_2\) と \(PM_{25}\) の測定値を1つのテーブルに結合したいです。
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 には2つの対応する軸があります。1つは行に沿って垂直下方向に実行される軸0、もう1つは列に沿って水平方向に実行される軸1です。連結や要約統計量のようなほとんどの操作はデフォルトでは行に沿って(軸0)行われますが、列に沿っても適用できます。
datetime 情報に基づいてテーブルをソートすると、両方のテーブルの結合も示されます。parameter 列はテーブルの元を定義します(air_quality_no2 テーブルからの no2 または air_quality_pm25 テーブルからの 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))。
高度なインデックス付け のユーザーガイドセクションで、マルチインデックスの世界に飛び込んでみてください。
テーブルの連結(行方向および列方向)に関する詳細なオプションと、concat を使用して他の軸のインデックスのロジック(結合または交差)を定義する方法については、オブジェクトの連結 のセクションで説明されています。
共通の識別子を使用してテーブルを結合する#
ステーションのメタデータテーブルから提供されるステーションの座標を、測定値テーブルの対応する行に追加します。
警告
大気質測定ステーションの座標は、py-openaq パッケージを使用してダウンロードされたデータファイル
air_quality_stations.csvに保存されています。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)は、メタデータテーブルに記載されている3つのエントリにすぎません。これらの3つの座標のみを測定テーブルに、それぞれ
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、London Westminster のみが結果のテーブルに残ります。merge関数は、データベーススタイルの操作と同様に複数のジョインオプションをサポートしています。
パラメーターメタデータテーブルから提供されるパラメーターの完全な説明と名前を、測定テーブルに追加します。
警告
大気質パラメータのメタデータは、py-openaq パッケージを使用してダウンロードされたデータファイル
air_quality_parameters.csvに保存されています。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列はどちらも、測定された変数を共通の形式で提供します。ここでは、両方のテーブル間のリンクを作成するために(onだけでなく)left_onおよびright_on引数が使用されます。
pandas は内部結合、外部結合、右結合もサポートしています。テーブルの結合/マージに関する詳細は、データベーススタイルのテーブルマージ のユーザーガイドセクションで提供されています。または、SQLとの比較 ページをご覧ください。
覚えておいてください
複数のテーブルは、
concat関数を使用して列方向と行方向の両方で連結できます。データベースのようなテーブルのマージ/結合には、
merge関数を使用します。
様々なデータテーブルを結合する機能の完全な説明については、ユーザーガイドを参照してください。