【Python】MultiIndex(マルチインデックス)の特定の階層データを抽出する方法

目次

MultiIndexによる多階層データの管理

Pandasでは、行インデックスに複数の階層を持たせる「MultiIndex」を使用することで、複雑な構造を持つデータを効率的に整理できます。例えば、「支店名」とその下の「部署名」といった親子関係にあるデータを一つのデータフレームで管理する場合に非常に有効です。

MultiIndexを持つデータフレームの構築

まず、地域名と店舗名の2層構造を持つインデックスを作成し、それに基づいた売上と来店客数のデータフレームを用意します。

import pandas as pd

# インデックス階層の定義(地域、店舗名)
index_structure = [
    ("East", "Store_A"),
    ("East", "Store_B"),
    ("West", "Store_C"),
    ("West", "Store_D"),
    ("South", "Store_E"),
    ("South", "Store_F")
]

# マルチインデックスの生成
m_index = pd.MultiIndex.from_tuples(index_structure, names=["Region", "Branch"])

# 統計データの定義(売上、客数)
store_stats = {
    "Sales_Amount": [850000, 920000, 780000, 880000, 650000, 710000],
    "Customer_Count": [450, 510, 390, 480, 320, 350]
}

# インデックスを適用してDataFrameを作成
df = pd.DataFrame(store_stats, index=m_index)

print("--- 作成したマルチインデックス・データフレーム ---")
print(df)

locを使用したデータの抽出方法

マルチインデックスが設定されたデータフレームでは、loc 属性を使用して特定の階層や特定の行を抽出します。

特定の階層(第1レベル)の抽出

第1階層(上位階層)のラベルを指定することで、そのカテゴリに属するすべてのデータを取得できます。

# 「East」地域のデータをすべて抽出
east_region_data = df.loc["East"]

print("\n--- East地域のデータ抽出結果 ---")
print(east_region_data)

特定の行(全階層指定)の抽出

特定の1行をピンポイントで取得したい場合は、インデックスの各階層をタプル形式で指定します。

# 「East」地域の「Store_A」のデータを抽出
target_store = df.loc[("East", "Store_A")]

print("\n--- East地域 Store_A の個別データ ---")
print(target_store)

実行結果

上記のコードを実行すると、階層構造に基づいた正確なデータ抽出が行われます。

--- 作成したマルチインデックス・データフレーム ---
                Sales_Amount  Customer_Count
Region Branch                               
East   Store_A        850000             450
       Store_B        920000             510
West   Store_C        780000             390
       Store_D        880000             480
South  Store_E        650000             320
       Store_F        710000             350

--- East地域のデータ抽出結果 ---
         Sales_Amount  Customer_Count
Branch                               
Store_A        850000             450
Store_B        920000             510

--- East地域 Store_A の個別データ ---
Sales_Amount      850000
Customer_Count       450
Name: (East, Store_A), dtype: int64

抽出時の注意点

loc で上位階層のみを指定した場合、返される結果は指定した階層が削除された新しいデータフレームとなります。一方で、タプルを用いてすべての階層を指定した場合は、その行の各カラムの値を保持した Series オブジェクトが返されます。このように抽出レベルによって返り値の型が変わる特性を理解することで、柔軟なデータ操作が可能になります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次