pandas

【pandas】Indexの基本

【pandas】Indexの基本

pandasのSeriesやDataFrameのインデックスで使用されているIndexの基本について解説します。

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)といったメソッドを使用することができます。

Note

Indexに関する公式ドキュメントの記載はこちらを参照してください。