「pandasを活用したMultiIndexデータ処理」:複雑なデータ構造を簡単に扱おう

はじめに

pandasは、Pythonでデータ分析を行う際に欠かせないライブラリです。その中でも、MultiIndexという機能は、複雑なデータ構造を扱う場合に特に便利な機能です。本記事では、MultiIndexの基本概念や作成方法、操作方法、応用例などを紹介していきます。

MultiIndexの基本概念と利点

MultiIndexとは、複数のキーを持つインデックスのことです。通常のインデックスでは、1つの列に1つのキーしか持てませんが、MultiIndexでは、1つの列に複数のキーを持たせることができます。これにより、複雑な階層構造を持つデータを扱うことができるようになります。

MultiIndexの利点は、主に以下の2つです。

  • データの分類やグループ化が簡単にできる。
  • データの検索や抽出が高速にできる。

pandasでのMultiIndexデータの作成方法

pandasでMultiIndexを作成する方法はいくつかありますが、ここでは、以下の方法について説明します。

  1. from_tuplesメソッドを使用する方法
  2. from_arraysメソッドを使用する方法
  3. from_productメソッドを使用する方法
  4. from_frameメソッドを使用する方法

1. from_tuplesメソッドを使用する方法

from_tuplesメソッドは、タプルのリストからMultiIndexを作成するメソッドです。以下の例では、2つの列に対して、それぞれ2つのキーを持つMultiIndexを作成しています。

import pandas as pd
index = pd.MultiIndex.from_tuples([('A', 'a'), ('A', 'b'), ('B', 'a'), ('B', 'b')])
print(index)
MultiIndex([('A', 'a'),
            ('A', 'b'),
            ('B', 'a'),
            ('B', 'b')],
           )

2.from_arraysメソッドを使用する方法

from_arraysメソッドは、配列のリストからMultiIndexを作成するメソッドです。以下の例では、2つの列に対して、それぞれ2つのキーを持つMultiIndexを作成しています。

import pandas as pd
arrays = [['A', 'A', 'B', 'B'], ['a', 'b', 'a', 'b']]
index = pd.MultiIndex.from_arrays(arrays)
print(index)
MultiIndex([('A', 'a'),
            ('A', 'b'),
            ('B', 'a'),
            ('B', 'b')],
           )

3. from_productメソッドを使用する方法

from_productメソッドは、複数の配列の直積からMultiIndexを作成するメソッドです。以下の例では、2つの列に対して、それぞれ2つのキーを持つMultiIndexを作成しています。

import pandas as pd
arrays = [['A', 'B'], ['a', 'b']]
index = pd.MultiIndex.from_product(arrays)
print(index)
MultiIndex([('A', 'a'),
            ('A', 'b'),
            ('B', 'a'),
            ('B', 'b')],
           )

4. from_frameメソッドを使用する方法

from_frameメソッドは、DataFrameからMultiIndexを作成するメソッドです。以下の例では、3つの列からMultiIndexを作成しています。

import pandas as pd
df = pd.DataFrame({'col1': ['A', 'A', 'B', 'B'], 'col2': ['a', 'b', 'a', 'b'], 'col3': [1, 2, 3, 4]})
index = pd.MultiIndex.from_frame(df[['col1', 'col2']])
print(index)
MultiIndex([('A', 'a'),
            ('A', 'b'),
            ('B', 'a'),
            ('B', 'b')],
           names=['col1', 'col2'])

MultiIndexデータの操作と処理方法

MultiIndexデータの操作と処理方法について、以下のような方法があります。

  • MultiIndexのインデックスの取得
  • MultiIndexのスライシング
  • MultiIndexのフィルタリング
  • MultiIndexのグループ化
  • MultiIndexの集計

MultiIndexのインデックスの取得

MultiIndexのインデックスは、以下のようにして取得することができます。

import pandas as pd
df = pd.DataFrame({'col1': ['A', 'A', 'B', 'B'], 'col2':
['a', 'b', 'a', 'b'], 'col3': [1, 2, 3, 4]})
index = pd.MultiIndex.from_frame(df[['col1', 'col2']])
print(index.get_level_values(0)) # 1つ目のインデックスを取得
print(index.get_level_values(1)) # 2つ目のインデックスを取得
Index(['A', 'A', 'B', 'B'], dtype='object', name='col1')
Index(['a', 'b', 'a', 'b'], dtype='object', name='col2')

MultiIndexのスライシング

MultiIndexのスライシングは、通常のデータフレームと同様に、locやilocを使用して行うことができます。以下の例では、2つ目のインデックスが’a’のデータを抽出しています。

import pandas as pd
df = pd.DataFrame({'col1': ['A', 'A', 'B', 'B'], 'col2': ['a', 'b', 'a', 'b'], 'col3': [1, 2, 3, 4]})
index = pd.MultiIndex.from_frame(df[['col1', 'col2']])
print(df.loc[index.get_level_values(1) == 'a'])
  col1 col2  col3
0    A    a     1
2    B    a     3

MultiIndexのフィルタリング

MultiIndexのフィルタリングは、通常のデータフレームと同様に、条件式を使用して行うことができます。以下の例では、2つ目のインデックスが’a’のデータを抽出しています。

import pandas as pd
df = pd.DataFrame({'col1': ['A', 'A', 'B', 'B'], 'col2': ['a', 'b', 'a', 'b'], 'col3': [1, 2, 3, 4]})
index = pd.MultiIndex.from_frame(df[['col1', 'col2']])
print(df[df['col2'] == 'a'])
  col1 col2  col3
0    A    a     1
2    B    a     3

MultiIndexのグループ化

MultiIndexのグループ化は、groupbyを使用して行うことができます。以下の例では、1つ目のインデックスでグループ化して、2つ目のインデックスの平均値を計算しています。

import pandas as pd
df = pd.DataFrame({'col1': ['A', 'A', 'B', 'B'], 'col2': ['a', 'b', 'a', 'b'], 'col3': [1, 2, 3, 4]})
index = pd.MultiIndex.from_frame(df[['col1', 'col2']])
print(df.groupby('col1')['col3'].mean())
print(df.groupby(['col1', 'col2'])['col3'].mean())
col1
A    1.5
B    3.5
Name: col3, dtype: float64
col1  col2
A     a       1
      b       2
B     a       3
      b       4
Name: col3, dtype: int64

MultiIndexの集計

MultiIndexの集計は、通常のデータフレームと同様に、sumやmeanなどの集計関数を使用して行うことができます。以下の例では、1つ目のインデックスでグループ化して、2つ目のインデックスの平均値を計算しています。

import pandas as pd
df = pd.DataFrame({'col1': ['A', 'A', 'B', 'B'], 'col2': ['a', 'b', 'a', 'b'], 'col3': [1, 2, 3, 4]})
index = pd.MultiIndex.from_frame(df[['col1', 'col2']])
print(df.groupby('col1')['col3'].sum())
print(df.groupby(['col1', 'col2'])['col3'].sum())
col1
A    3
B    7
Name: col3, dtype: int64
col1  col2
A     a       1.0
      b       2.0
B     a       3.0
      b       4.0
Name: col3, dtype: float64

まとめ

本記事では、pandasのMultiIndexを使用したデータ処理の方法について紹介しました。MultiIndexを使用することで、複雑なデータ構造を簡単に扱うことができます。MultiIndexの作成方法や操作方法については、この記事を参考にしてください。