サイトアイコン アマチュア無線局JS2IIU

【Pandas】階層インデックス(MultiIndex)の基本と実践的活用

こんにちは、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階層目のインデックス名リスト]]の形式にします。

Python
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階層目のインデックス名リスト]]の形式にします。

Python
# 配列のリストから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階層目のインデックス名)というセットになったデータを保持している場合に使える方法です。

Python
# タプルの配列から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を作る場合に適した方法です。

Python
# 直積集合から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にしてしまう方法です。

Python
# 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 インデックスレベルへのアクセス

Python
# 特定の最上位インデックスを選択
print(df.loc['A'])

# 特定の階層インデックスを選択
print(df.loc[('A', 'X')])

3.2 インデックスレベルのスライシング

Python
# 特定のレベルでデータを抽出
print(df.xs('A', level='first_level'))

3.3 インデックスレベルの並び替え

Python
# インデックスレベルの入れ替え
df_swapped = df.swaplevel(0, 1)

4. 実践的なユースケース

MultiIndexは、以下のようなシーンで特に有用です:

5. 注意点と推奨事項

参考リンク

データサイエンスの世界で、MultiIndexは複雑なデータ構造を扱う際の強力な武器となります。ぜひ実際のプロジェクトで活用してみてください。

今回も少しだけPRです。

Pandasについて詳しく知りたいかた、もっと使いこなしたい方におすすめの本です。数年前に購入しましたが、今も手元に置いて時々見返しています。

「pandasクックブック Pythonによるデータ処理のレシピ」Theodore Petrou著、黒川利明訳。

最後まで読んでいただきありがとうございます。73

モバイルバージョンを終了