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が提供し、py-openaqパッケージを使用してダウンロードされた2.5マイクロメートル未満の粒子状物質に関する大気質データを使用します。

    air_quality_pm25_long.csvデータセットは、それぞれパリ、アントワープ、ロンドンの測定ステーションFR04014BETR801London 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
  • 類似した構造を持つ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を使用して他の軸のインデックスのロジック(和集合または積集合)を定義する方法については、オブジェクトの連結セクションを参照してください。

共通の識別子を使用してテーブルを結合する#

../../_images/08_merge_left.svg
  • ステーションメタデータテーブルで提供されるステーション座標を、測定値テーブルの対応する行に追加します。

    警告

    大気質測定ステーションの座標は、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_nameid列はどちらも、共通の形式で測定された変数を提供します。onの代わりにleft_onright_on引数がここで使用され、2つのテーブル間のリンクが作成されます。

ユーザーガイドへ

pandasは内部結合、外部結合、右結合もサポートしています。テーブルの結合/マージに関する詳細情報は、ユーザーガイドのデータベーススタイルのテーブルのマージセクションを参照してください。または、SQLとの比較ページをご覧ください。

覚えておきましょう

  • concat関数を使用して、複数のテーブルを列方向と行方向の両方で連結できます。

  • データベースのようなテーブルのマージ/結合には、merge関数を使用します。

ユーザーガイドへ

さまざまなデータテーブルを結合するための機能の完全な説明については、ユーザーガイドを参照してください。