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
には、行に沿って垂直方向に下向きに走る最初の軸(軸0)、列に沿って水平方向に走る2番目の軸(軸1)の2つの対応する軸があります。連結や要約統計量などのほとんどの操作は、デフォルトで行(軸0)に沿って行われますが、列にも適用できます。
日付時刻情報に基づいてテーブルをソートすると、2つのテーブルの組み合わせも示されます。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つの座標のみを追加したいと考えています。
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
引数がここで使用され、2つのテーブル間のリンクが作成されます。
pandasは内部結合、外部結合、右結合もサポートしています。テーブルの結合/マージに関する詳細情報は、ユーザーガイドのデータベーススタイルのテーブルのマージセクションを参照してください。または、SQLとの比較ページをご覧ください。
覚えておきましょう
concat
関数を使用して、複数のテーブルを列方向と行方向の両方で連結できます。データベースのようなテーブルのマージ/結合には、
merge
関数を使用します。
さまざまなデータテーブルを結合するための機能の完全な説明については、ユーザーガイドを参照してください。