
はじめに
pandasは、Pythonでデータ分析を行う際に欠かせないライブラリです。その中でも、MultiIndexという機能は、複雑なデータ構造を扱う場合に特に便利な機能です。本記事では、MultiIndexの基本概念や作成方法、操作方法、応用例などを紹介していきます。
MultiIndexの基本概念と利点
MultiIndexとは、複数のキーを持つインデックスのことです。通常のインデックスでは、1つの列に1つのキーしか持てませんが、MultiIndexでは、1つの列に複数のキーを持たせることができます。これにより、複雑な階層構造を持つデータを扱うことができるようになります。
MultiIndexの利点は、主に以下の2つです。
- データの分類やグループ化が簡単にできる。
- データの検索や抽出が高速にできる。
pandasでのMultiIndexデータの作成方法
pandasでMultiIndexを作成する方法はいくつかありますが、ここでは、以下の方法について説明します。
- from_tuplesメソッドを使用する方法
- from_arraysメソッドを使用する方法
- from_productメソッドを使用する方法
- from_frameメソッドを使用する方法
1. from_tuplesメソッドを使用する方法
from_tuplesメソッドは、タプルのリストからMultiIndexを作成するメソッドです。以下の例では、2つの列に対して、それぞれ2つのキーを持つMultiIndexを作成しています。
1 2 3 | import pandas as pd index = pd.MultiIndex.from_tuples([( 'A' , 'a' ), ( 'A' , 'b' ), ( 'B' , 'a' ), ( 'B' , 'b' )]) print (index) |
1 2 3 4 5 | MultiIndex([( 'A' , 'a' ), ( 'A' , 'b' ), ( 'B' , 'a' ), ( 'B' , 'b' )], ) |
2.from_arraysメソッドを使用する方法
from_arraysメソッドは、配列のリストからMultiIndexを作成するメソッドです。以下の例では、2つの列に対して、それぞれ2つのキーを持つMultiIndexを作成しています。
1 2 3 4 | import pandas as pd arrays = [[ 'A' , 'A' , 'B' , 'B' ], [ 'a' , 'b' , 'a' , 'b' ]] index = pd.MultiIndex.from_arrays(arrays) print (index) |
1 2 3 4 5 | MultiIndex([( 'A' , 'a' ), ( 'A' , 'b' ), ( 'B' , 'a' ), ( 'B' , 'b' )], ) |
3. from_productメソッドを使用する方法
from_productメソッドは、複数の配列の直積からMultiIndexを作成するメソッドです。以下の例では、2つの列に対して、それぞれ2つのキーを持つMultiIndexを作成しています。
1 2 3 4 | import pandas as pd arrays = [[ 'A' , 'B' ], [ 'a' , 'b' ]] index = pd.MultiIndex.from_product(arrays) print (index) |
1 2 3 4 5 | MultiIndex([( 'A' , 'a' ), ( 'A' , 'b' ), ( 'B' , 'a' ), ( 'B' , 'b' )], ) |
4. from_frameメソッドを使用する方法
from_frameメソッドは、DataFrameからMultiIndexを作成するメソッドです。以下の例では、3つの列からMultiIndexを作成しています。
1 2 3 4 | 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) |
1 2 3 4 5 | MultiIndex([( 'A' , 'a' ), ( 'A' , 'b' ), ( 'B' , 'a' ), ( 'B' , 'b' )], names = [ 'col1' , 'col2' ]) |
MultiIndexデータの操作と処理方法
MultiIndexデータの操作と処理方法について、以下のような方法があります。
- MultiIndexのインデックスの取得
- MultiIndexのスライシング
- MultiIndexのフィルタリング
- MultiIndexのグループ化
- MultiIndexの集計
MultiIndexのインデックスの取得
MultiIndexのインデックスは、以下のようにして取得することができます。
1 2 3 4 5 6 | 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つ目のインデックスを取得 |
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’のデータを抽出しています。
1 2 3 4 | 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' ]) |
1 2 3 | col1 col2 col3 0 A a 1 2 B a 3 |
MultiIndexのフィルタリング
MultiIndexのフィルタリングは、通常のデータフレームと同様に、条件式を使用して行うことができます。以下の例では、2つ目のインデックスが’a’のデータを抽出しています。
1 2 3 4 | 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' ]) |
1 2 3 | col1 col2 col3 0 A a 1 2 B a 3 |
MultiIndexのグループ化
MultiIndexのグループ化は、groupbyを使用して行うことができます。以下の例では、1つ目のインデックスでグループ化して、2つ目のインデックスの平均値を計算しています。
1 2 3 4 5 | 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()) |
1 2 3 4 5 6 7 8 9 10 | 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つ目のインデックスの平均値を計算しています。
1 2 3 4 5 | 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 ()) |
1 2 3 4 5 6 7 8 9 10 | 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の作成方法や操作方法については、この記事を参考にしてください。