【Python】Pandasマルチインデックスの活用:効果的なインデックス指定方法

はじめに

データ分析において、複数のキーによって行や列を分類することがあります。このような場合、Pandasのマルチインデックスを活用すると効率的にデータの操作ができます。本記事では、Pandasのマルチインデックスの利点や作成方法、効果的なインデックス指定方法、そしてマルチインデックスを用いたデータ分析の実践例を紹介します。

マルチインデックスの利点とPandasでの活用

マルチインデックスとは、1つ以上のキーを持った階層的なインデックスのことです。例えば、店舗ごとに日付と商品カテゴリで売り上げデータを管理する場合、店舗名と日付、そして商品カテゴリの3つのキーによってインデックスを作成します。

import pandas as pd

# 3つのキーによるマルチインデックスの作成
data = {'store': ['Tokyo', 'Tokyo', 'Osaka', 'Osaka'],
        'date': ['2022-01-01', '2022-01-02', '2022-01-01', '2022-01-02'],
        'category': ['food', 'drink', 'food', 'drink'],
        'sales': [100, 200, 150, 250]}
df = pd.DataFrame(data)
df.set_index(['store', 'date', 'category'], inplace=True)

print(df)

上記のコードで作成されたデータフレームは以下のようになります。

                           sales
store date       category       
Tokyo 2022-01-01 food        100
      2022-01-02 drink       200
Osaka 2022-01-01 food        150
      2022-01-02 drink       250

このように、マルチインデックスを用いると複数のキーによってデータを分類し、より詳細な分析が可能になります。また、Pandasではマルチインデックスに対して様々な操作が可能です。例えば、以下のような操作が可能です。

  • インデックスの階層の入れ替え
  • 特定のキーに基づいてデータを抽出
  • 階層ごとに統計量を計算
  • 階層ごとにグループ化して集計
  • マルチインデックスの値をピボットテーブルのように表示

データの読み込みとデータフレーム作成

本記事では、株価データを例に、マルチインデックスの作成方法や活用方法を説明します。使用するデータは、Yahoo Financeからダウンロードした東京電力株価のデータで、以下のURLから取得できます。

https://finance.yahoo.com/quote/9501.T/history/

ダウンロードしたcsvファイルをPandasで読み込み、データフレームを作成します。以下のコードを実行してください。

import pandas as pd
# csvファイルを読み込み、日付をインデックスに指定
df = pd.read_csv('9501.T.csv', index_col='Date', parse_dates=True)
print(df.head())

データフレームの先頭の5行を表示すると、以下のようになります。

Open High Low Close Adj Close Volume Date
2016-05-02 304.000000 304.500000 302.399994 302.799988 293.0 1559800.0
2016-05-03 302.399994 302.399994 300.100006 301.000000 291.3 1681700.0
2016-05-04 302.000000 303.700012 301.500000 302.100006 292.3 1023300.0
2016-05-06 304.000000 305.799988 303.500000 305.100006 295.2 826500.0
2016-05-09 304.899994 305.799988 304.000000 305.100006 295.2 735400.0

このデータフレームは、各行に日付がインデックスとして設定されています。しかし、このままでは日付を単一のインデックスとして扱うことしかできません。次に、複数のキーによるマルチインデックスを作成する方法を説明します。

マルチインデックスの作成方法

データフレームにマルチインデックスを作成する場合、以下の2つの方法があります。

  • set_index()メソッドを使用して、インデックスを設定する
    • MultiIndex.from_arrays()メソッドを使用して、配列からマルチインデックスを作成する

    set_index()メソッドを使用する方法は、上記の店舗ごとの売り上げデータの例で既に使用しています。東京電力株価の場合は、以下のように、年と月の2つのキーによるマルチインデックスを作成します。

    # 年と月の2つのキーによるマルチインデックスの作成
    df.set_index([df.index.year, df.index.month], inplace=True)
    print(df.head())
    

    set_index()メソッドを使用して、データフレームにマルチインデックスを作成することができます。次に、マルチインデックスのインデックス指定方法やオプションについて説明します。

    インデックス指定の効果的な方法とオプション

    マルチインデックスを使用すると、複数のキーに基づいてデータを抽出できます。以下のように、loc[]メソッドを使用して、年が2018年のデータを抽出することができます。

    print(df.loc[2018])
    

    上記のコードを実行すると、2018年のデータが表示されます。

    また、マルチインデックスには、loc[]メソッドによるインデックス指定の他に、以下のオプションがあります。

    • xs()メソッドを使用して、インデックスの一部を取得
      • query()メソッドを使用して、条件に基づいてデータを抽出
      • slicersを使用して、範囲指定によるデータ抽出

      xs()メソッドは、loc[]メソッドよりも柔軟性があり、特定のインデックスの値だけを抽出できます。以下のように、2017年1月のデータを抽出することができます。

      print(df.xs((2017,1)))
      

      query()メソッドは、SQLのように条件に基づいてデータを抽出できます。以下のように、2017年1月の終値が300より大きいデータを抽出することができます。

      print(df.query('(2017,1) < Close < 300'))
      

      slicersは、範囲指定によるデータ抽出に使用されます。以下のように、2017年から2018年の範囲のデータを抽出することができます。

      print(df.loc[(slice(2017,2018), slice(None)), 'Close'])
      

      上記のコードで抽出されたデータは、日付の昇順に並べ替えられます。このように、Pandasではマルチインデックスに対して、様々なインデックス指定方法やオプションが用意されています。

      まとめ

      本記事では、Pandasのマルチインデックスを活用したデータ分析について解説しました。具体的には、マルチインデックスの利点や作成方法、インデックス指定方法やオプションを紹介しました。Pandasのマルチインデックスは、複数のキーに基づいたデータの操作や分析に非常に便利です。本記事が、Pandasのマルチインデックスを活用したデータ分析に興味を持っていただけたら幸いです。