【Pandas】MultiIndexを持つDataFrameの作り方

Pandas
この記事は約9分で読めます。

こんにちは、JS2IIUです。

PandasのMultiIndexは、行や列に複数のインデックスを持つDataFrameを作成する機能で、大規模で階層的なデータを効率的に管理・操作する際に役立ちます。本記事では、MultiIndexの概要やメリットについて詳しく解説し、いくつかの具体的な作成方法を紹介します。今回もよろしくお願いします。

MultiIndexの概要とメリット

MultiIndexとは?

PandasのMultiIndexは、1つの行または列に複数のレベルのインデックスを持つことができる仕組みです。通常のインデックスに比べて、階層構造を持つデータを自然に表現できます。たとえば、次のようなデータを考えます:

GroupSubgroupValue
Ax10
Ay20
Bx30
By40

このデータは、GroupSubgroupをインデックスにすることで、次のようなMultiIndex DataFrameとして表現できます:

Plaintext
               Value
Group Subgroup       
A     x            10
      y            20
B     x            30
      y            40

pd.MultiIndexオブジェクト

MultiIndexを持つDataFrameは、indexMultiIndexオブジェクトを設定したDataFrameです。MultiIndexオブジェクトの構造は以下のように、一階層め、二階層めのインデックスをタプルにし、行数分をリスト化したデータ部分と、各階層のラベル名をリストにしたnamesで構成されています。DataFrameと同様に.values.namesでそれぞれの要素にアクセスすることが可能です。

MultiIndexのメリット

  1. 階層的なデータ管理:
    複数のインデックスを持つことで、データの階層構造を直感的に表現できます。
  2. 柔軟なデータ操作:
    インデックスの階層ごとにデータを選択、集約、並べ替えが可能になります。
  3. データの視認性向上:
    大規模データを整理して表示する際に有用です。

MultiIndexを持つDataFrameを作る方針をまとめます。

MultiIndexを持つDataFrameを作る方法

以下では、MultiIndexを持つDataFrameを作成する5つの方法を紹介します。それぞれにサンプルコードと丁寧な解説をつけています。

1. pd.MultiIndex.from_tuplesを使用

タプルのリストからMultiIndexを作成する方法です。MultiIndexの一階層と、2階層のインデックスを組みにしたタプルのセットを行数分のリストにしてfrom_tupleメソッドの引数に与えます。

Python
import pandas as pd

# データ作成
data = {'value': [10, 20, 30, 40]}
index = pd.MultiIndex.from_tuples([('A', 'x'), ('A', 'y'), ('B', 'x'), ('B', 'y')],
                                   names=['Group', 'Subgroup'])

# DataFrame作成
df = pd.DataFrame(data, index=index)
print(df)

解説

  1. pd.MultiIndex.from_tuplesは、タプルのリストを受け取りMultiIndexを作成します。
  2. names引数で各レベルの名前を指定できます。
  3. この方法は、明確な階層データが既にタプルとして用意されている場合に便利です。

2. set_indexを使用

既存の列からMultiIndexを設定する方法です。set_indexメソッドで、複数のカラムを指定することでMultiIndexになります。

Python
import pandas as pd

# データ作成
data = {'Group': ['A', 'A', 'B', 'B'],
        'Subgroup': ['x', 'y', 'x', 'y'],
        'value': [10, 20, 30, 40]}

df = pd.DataFrame(data)

# Multi-indexを設定
df = df.set_index(['Group', 'Subgroup'])
print(df)

解説

  1. set_indexは、指定した列をインデックスに設定します。
  2. 複数の列をリストで指定することで、MultiIndexが作成されます。
  3. 元の列はインデックスに移動され、DataFrameには表示されなくなります。

3. pd.MultiIndex.from_productを使用

直積を利用してインデックスを生成する方法です。

Python
import pandas as pd

# インデックス作成
index = pd.MultiIndex.from_product([['A', 'B'], ['x', 'y']], names=['Group', 'Subgroup'])

# データ作成
data = {'value': [10, 20, 30, 40]}

# DataFrame作成
df = pd.DataFrame(data, index=index)
print(df)

解説

  1. pd.MultiIndex.from_productは、リストの直積を計算してMultiIndexを作成します。
  2. この方法は、全ての組み合わせを網羅したインデックスを作りたい場合に適しています

4. pd.MultiIndex.from_frameを使用

DataFrameからMultiIndexを生成する方法です。

Python
import pandas as pd

# データ作成
data = {'Group': ['A', 'A', 'B', 'B'],
        'Subgroup': ['x', 'y', 'x', 'y']}

# DataFrameからMulti-indexを作成
index = pd.MultiIndex.from_frame(pd.DataFrame(data))

# DataFrame作成
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=index)
print(df)

pd.DataFrame(data)は以下のような構造になっています。このDataFrameをMultiIndex.from_frameメソッドでマルチインデックス化します。

解説

  1. pd.MultiIndex.from_frameは、DataFrameの列を利用してMultiIndexを生成します。
  2. データが既にDataFrame形式で用意されている場合に便利です。

5. pd.MultiIndex.from_arrayを使用

リストからMultiIndexオブジェクトを作る方法です。from_arraysメソッドを使います。

Python
# 各階層ごとにリストになったインデックス
arrays = [['A', 'A', 'B', 'B'], ['x', 'y', 'x', 'y']]
index = pd.MultiIndex.from_arrays(arrays, names = ('Group', 'Subgroup')

# DataFrame作成
df = pd.DataFrame({'value': [10, 20, 30, 40]}, index=index)
print(df)

解説

  • pd.MultiIndex.from_arraysは、インデックスをリスト化したものを利用してMultiIndexを生成します。
  • MultiIndexの要素をすでにリストの形で保持できている場合に使います。

6. ネストされた辞書を使用

ネストされた辞書を直接DataFrameに変換する方法です。

Python
import pandas as pd

# ネストされた辞書を作成
data = {('A', 'x'): 10, ('A', 'y'): 20, ('B', 'x'): 30, ('B', 'y'): 40}

# DataFrame作成
df = pd.DataFrame.from_dict(data, orient='index', columns=['value'])
df.index = pd.MultiIndex.from_tuples(df.index, names=['Group', 'Subgroup'])
print(df)

df = pd.DataFrame.from_dict(data, orient=’index’, columns=[‘value’])でDataFrameを作ります。できたDataFrameはつぎのような構造になっています。indexがタプルになったDataFrameです。

解説

  1. ネストされた辞書をpd.DataFrame.from_dictでDataFrameに変換します。
  2. 辞書のキーをpd.MultiIndex.from_tuplesMultiIndexに設定します。

MultiIndexを持つDataFrameの操作例

作成したMultiIndex DataFrameは、以下のように操作できます:

  • 特定のインデックスレベルでデータを選択
  • レベルごとの並べ替えや集約
  • インデックスの解除

これらの操作については、別の記事で詳しく解説します。

まとめ

PandasのMultiIndexは、階層構造を持つデータを効率的に管理する強力なツールです。本記事で紹介した5つの作成方法を活用することで、柔軟なデータ構造を作成できるようになります。次回は、MultiIndex DataFrameの操作方法についてさらに深く掘り下げていきます。

MultiIndex DataFrameの要素へのアクセス方法について、色々な方法をまとめた記事を書きました。こちらから参照して下さい。

参考リンク

今回も少しだけPRです。

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

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

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

コメント

タイトルとURLをコピーしました