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のマルチインデックスについてでした。
最後までお読みいただき、ありがとうございました。