pandasのSeriesやDataFrameのインデックスで使用されているIndexの基本について解説します。
Contents
pandasのIndex
pandasでよく使用されるSeriesとDataFrameでは、要素のアクセスにインデックスを使用します。pandasでは、このインデックスはIndexクラスとして実装されています。
以下のSeriesとDataFrameの作成例を見てみましょう。
import numpy as np import pandas as pd # Series ser = pd.Series([1, 2, 3], index=['A', 'B', 'C']) print(ser) print(ser.index) print('\n') # DataFrame df = pd.DataFrame(np.arange(9).reshape((3, 3)), index=[1, 2, 3], columns=['A', 'B', 'C']) print(df) print(df.index) print(df.columns)
【実行結果】 A 1 B 2 C 3 dtype: int64 Index(['A', 'B', 'C'], dtype='object') A B C 1 0 1 2 2 3 4 5 3 6 7 8 Int64Index([1, 2, 3], dtype='int64') Index(['A', 'B', 'C'], dtype='object')
上記の例でindexやcolumnsを表示してみていますが、型がInt64IndexやIndexといったIndexオブジェクトとなっていることが分かります。
このIndexクラスのオブジェクト自体が特徴的な部分があるため、以降ではIndexオブジェクトの操作について説明していきます。
Indexオブジェクトの操作の基本
Indexオブジェクトの作成例
Indexオブジェクトは、以下のようにPythonのリストを受け取って生成することできます。
import pandas as pd ind = pd.Index([1, 2, 3]) print(ind) ind = pd.Index(['A', 'B', 'C']) print(ind)
【実行結果】 Int64Index([1, 2, 3], dtype='int64') Index(['A', 'B', 'C'], dtype='object')
Indexオブジェクトに対するアクセス
Indexオブジェクトの要素へは、Pythonのリスト等と同じようにアクセスすることができます。
import pandas as pd ind = pd.Index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # 要素へのアクセス print(ind[1]) # スライスによるアクセス print(ind[1:9:2]) # 各種情報へのアクセス print(ind.size) print(ind.shape) print(ind.ndim) print(ind.dtype)
【実行結果】 2 Int64Index([2, 4, 6, 8], dtype='int64') 10 (10,) 1 int64
上記の例のように、位置を指定したり、スライス記法によって一部を抽出することができます。また、NumPyの配列(ndarray)のように、size、shape、ndim、dtypeといった属性値へも同じようにアクセスすることができます。
Indexオブジェクトはイミュータブル(immutable)
Indexオブジェクトは、「イミュータブル(immutable)」で変更ができないという点に特徴があります。
インデックスがミュータブル(mutable)で変更可能である場合、変更してしまったことによりデータ間の連携で想定しない問題が発生する可能性が出てしまいます。このイミュータブルであるという特徴があることで、データ分析等の際に複数データ間で安全にインデックスを共有することができます。
Indexオブジェクトがイミュータブル(immutable)であるということを簡単な例で見てみましょう。
import pandas as pd ind = pd.Index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # Indexオブジェクトはイミュータブル(immutable)なため要素の変更はできない ind[0] = 10
【実行結果例】 TypeError: Index does not support mutable operations
上記のように、インデックス要素の値を変更しようとすると、TypeErrorになりミュータブルな操作はサポートしていないというエラーになります。
Indexオブジェクトの集合演算
pandasのIndexオブジェクトは、複数データの結合といった操作を容易にできるようにするために集合演算ができるようになっており、Python組み込みの集合であるsetと同じように演算をすることができます。
import pandas as pd indA = pd.Index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) indB = pd.Index([6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) print(f'積集合 A&B: {indA.intersection(indB)}') print(f'和集合 A|B: {indA.union(indB)}') print(f'差集合 A-B: {indA.difference(indB)}') print(f'差集合 B-A: {indB.difference(indA)}') print(f'排他的論理和 A^B: {indA.symmetric_difference(indB)}')
【実行結果】 積集合 A&B: Int64Index([6, 7, 8, 9, 10], dtype='int64') 和集合 A|B: Int64Index([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15], dtype='int64') 差集合 A-B: Int64Index([1, 2, 3, 4, 5], dtype='int64') 差集合 B-A: Int64Index([11, 12, 13, 14, 15], dtype='int64') 排他的論理和 A^B: Int64Index([1, 2, 3, 4, 5, 11, 12, 13, 14, 15], dtype='int64')
上記の結果でもわかるように、Pythonのsetと同じように積集合(intersection)、和集合(union)、差集合(difference)、排他的論理和(symmetric_difference)といったメソッドを使用することができます。
Indexに関する公式ドキュメントの記載はこちらを参照してください。
上記で紹介しているソースコードについてはgithubにて公開しています。参考にしていただければと思います。