PythonのPandasのマルチインデックスについて

マルチインデックス,イメージ

AI実装検定のご案内

Pandasのマルチインデックス(MultiIndex)は、データフレームやシリーズの行や列に階層構造を持たせるための仕組みです。

これは、Excelで言えば行や列に「グループ化されたラベル(階層)」をつけるようなもので、データの多次元的な構造や複雑な集計操作を可能にします。

目次

マルチインデックスとは?

PandasのMultiIndexは、インデックス(行または列)の階層的なラベル構造です。

例えば、以下のような構造ができます。

              売上
地域     店舗
関東    東京    1000
        横浜     800
関西    大阪     950
        京都     770

このように「地域」と「店舗」の2つの軸でデータを管理することで、柔軟な抽出や集約が可能になります。

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

方法1: set_index() を使う

import pandas as pd

df = pd.DataFrame({
    '地域': ['関東', '関東', '関西', '関西'],
    '店舗': ['東京', '横浜', '大阪', '京都'],
    '売上': [1000, 800, 950, 770]
})

df_multi = df.set_index(['地域', '店舗'])
print(df_multi)

方法2: タプルのリストから直接作成

import pandas as pd

# マルチインデックスの作成
index = pd.MultiIndex.from_tuples([
    ('関東', '東京'),
    ('関東', '横浜'),
    ('関西', '大阪'),
    ('関西', '京都')
], names=['地域', '店舗'])

# データフレームの作成
df = pd.DataFrame({'売上': [1000, 800, 950, 770]}, index=index)

# 出力
print(df)

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

階層ごとの選択(スライス)

# '関東'エリアだけ選択
print(df.loc['関東'])

# ('関西', '京都') をピンポイントで取得
print(df.loc[('関西', '京都')])

インデックスの並べ替え(sort_index

# 店舗名の順に並べ替え
df_sorted = df.sort_index(level='店舗')
print(df_sorted)

インデックスレベルの入れ替え(swaplevel

# 地域と店舗を入れ替える
df_swapped = df.swaplevel('地域', '店舗')
print(df_swapped)

インデックス名の取得と変更

# インデックス名の取得
print(df.index.names)

# 名前の変更(例:'地域' → 'エリア', '店舗' → '支店')
df.index.set_names(['エリア', '支店'], inplace=True)
print(df)

インデックスのリセット(reset_index

# 完全にフラットな形式に戻す
df_reset = df.reset_index()
print(df_reset)

# 一部のみ(支店のみ)リセット
df_partial_reset = df.reset_index(level='支店')
print(df_partial_reset)

よくある用途:グループ集計

# 商品別・月別の売上集計例
sales_df = pd.DataFrame({
    '商品カテゴリ': ['A', 'A', 'B', 'B'],
    '月': ['1月', '2月', '1月', '2月'],
    '売上': [100, 150, 200, 250]
})

# グループ集計してマルチインデックスに
grouped = sales_df.groupby(['商品カテゴリ', '月']).sum()
print(grouped)

ピボットテーブルでマルチインデックスを使う

df_pivot = pd.DataFrame({
    '地域': ['関東', '関東', '関西', '関西'],
    '店舗': ['東京', '横浜', '大阪', '京都'],
    '月': ['1月', '1月', '1月', '1月'],
    '売上': [1000, 800, 950, 770]
})

# 地域・店舗ごとの売上(列に月を展開)
pivot = df_pivot.pivot_table(values='売上', index=['地域', '店舗'], columns='月')
print(pivot)

注意点とベストプラクティス

項目内容
インデックスの順序階層の順番で選択・スライスが異なるため、意図的に設計すること
パフォーマンスマルチインデックスは柔軟だが、複雑な操作は処理が遅くなる可能性がある
視認性reset_index() を使ってフラットにした方が見やすくなる場合がある
並べ替えsort_index() を使わないと意図した抽出ができないことがある

補足:列のマルチインデックス(カラムの階層)

行だけでなく列にも階層構造を持たせることができます。

以下のような形です。

import pandas as pd

# マルチカラムの作成
columns = pd.MultiIndex.from_product(
    [['2023', '2024'], ['売上', '利益']],
    names=['年度', '指標']
)

# データフレーム作成
df_col_multi = pd.DataFrame([[100, 20, 110, 25]], columns=columns)

# 出力
print(df_col_multi)

出力例

      2023       2024     
       売上 利益   売上 利益
0     100  20    110  25

これにより、年ごとの売上と利益なども簡単に整理できます。

まとめ

特徴内容
多次元構造行や列に複数のラベル階層を持たせて複雑なデータ管理が可能
柔軟な選択スライスやタプルによるアクセスが可能
データ整形が簡単グループ化・ピボット・クロス集計と相性がよい
学習コスト初学者には難解に見えるが、慣れると非常に強力

以上、PythonのPandasのマルチインデックスについてでした。

最後までお読みいただき、ありがとうございました。

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