こんにちは、JS2IIUです。
今回もMultiIndexについて説明していきたいと思います。よろしくお願いします。
1. MultiIndexとは
MultiIndexは、Pandasにおいて複数の階層を持つインデックスを作成する強力な機能です。通常の1次元インデックスと異なり、データをより複雑で深い階層構造で表現できます。
いくつかMultiIndexを持つDataFrameの例を見てみます。
indexがMultiIndexになっている例:
columnsがMultiIndexになっている例:
index, columns両方ともMultiIndexになっている例:
2. MultiIndexの作成方法
Pandasでは、MultiIndexを作成する複数の方法が提供されています:
2.1 リストを使用した直接的な作成
indexオプションに階層ごとのインデックス名リストを渡します。リストは[[1階層目のインデックス名リスト], [2階層目のインデックス名リスト]]の形式にします。
import pandas as pd
# リストを使用したMultiIndex DataFrame作成
df1 = pd.DataFrame(
[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
index=[['A', 'A', 'B'], ['X', 'Y', 'X']],
columns=['col1', 'col2', 'col3']
)2.2 pd.MultiIndex.from_arrays()メソッド
最初にインデックス名のリストベースにMultiIndexオブジェクトを作ってからDataFrameを作る、という手順を示しています。リストは[[1階層目のインデックス名リスト], [2階層目のインデックス名リスト]]の形式にします。
# 配列のリストからMultiIndexを作成
multi_index = pd.MultiIndex.from_arrays(
[['A', 'A', 'B'], ['X', 'Y', 'X']],
names=['first_level', 'second_level']
)
df2 = pd.DataFrame(
[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
index=multi_index,
columns=['col1', 'col2', 'col3']
)2.3 pd.MultiIndex.from_tuples()メソッド
MultiIndexを作る際にタプルを渡す例です。元のデータが(1階層目のインデックス名、2階層目のインデックス名)というセットになったデータを保持している場合に使える方法です。
# タプルの配列からMultiIndexを作成
multi_index_tuples = pd.MultiIndex.from_tuples(
[('A', 'X'), ('A', 'Y'), ('B', 'X')],
names=['first_level', 'second_level']
)
df3 = pd.DataFrame(
[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
index=multi_index_tuples,
columns=['col1', 'col2', 'col3']
)2.4 pd.MultiIndex.from_product()メソッド
この方法は直積を使って、パターンを網羅するMultiIndexを作る場合に適した方法です。
# 直積集合からMultiIndexを作成
multi_index_product = pd.MultiIndex.from_product(
[['A', 'B'], ['X', 'Y']],
names=['first_level', 'second_level']
)
df4 = pd.DataFrame(
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]],
index=multi_index_product,
columns=['col1', 'col2', 'col3']
)2.5 pd.MultiIndex.from_frame()メソッド
元のDataFrameをMultiIndexにしてしまう方法です。
# DataFrameからMultiIndexを作成
df_source = pd.DataFrame({
'first_level': ['A', 'A', 'B'],
'second_level': ['X', 'Y', 'X']
})
multi_index_from_frame = pd.MultiIndex.from_frame(df_source)
df5 = pd.DataFrame(
[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
index=multi_index_from_frame,
columns=['col1', 'col2', 'col3']
)3. MultiIndexの操作
3.1 インデックスレベルへのアクセス
# 特定の最上位インデックスを選択
print(df.loc['A'])
# 特定の階層インデックスを選択
print(df.loc[('A', 'X')])3.2 インデックスレベルのスライシング
# 特定のレベルでデータを抽出
print(df.xs('A', level='first_level'))3.3 インデックスレベルの並び替え
# インデックスレベルの入れ替え
df_swapped = df.swaplevel(0, 1)4. 実践的なユースケース
MultiIndexは、以下のようなシーンで特に有用です:
- 時系列データの階層的管理
- 複数のグループ化されたデータの効率的な処理
- 多次元データの簡潔な表現
- 複雑な統計解析や科学的データ分析
5. 注意点と推奨事項
- インデックス名は可能な限り明確で意味のあるものにする
- データの構造に応じて適切なMultiIndex作成方法を選択する
- パフォーマンスを考慮し、不要に複雑な階層を作らない
- 異なるMultiIndex作成方法の特性を理解し、最適な方法を選択する
参考リンク
- Pandas 公式ドキュメント – MultiIndex
- Real Python – Pandas MultiIndex
- Towards Data Science – Mastering Pandas MultiIndex
データサイエンスの世界で、MultiIndexは複雑なデータ構造を扱う際の強力な武器となります。ぜひ実際のプロジェクトで活用してみてください。
今回も少しだけPRです。
Pandasについて詳しく知りたいかた、もっと使いこなしたい方におすすめの本です。数年前に購入しましたが、今も手元に置いて時々見返しています。
「pandasクックブック Pythonによるデータ処理のレシピ」Theodore Petrou著、黒川利明訳。
最後まで読んでいただきありがとうございます。73

