『Python数値計算ノート』ではアフィリエイトプログラムを利用して商品を紹介しています。

pandas.Index

【pandas】データのラベリング

Series オブジェクトや DataFrame オブジェクトのラベリングに用いられる Indexオブジェクトpandas.Index() を使って生成することもできます。

# PANDAS_INDEX_01

# In[1]

import numpy as np
import pandas as pd

# Indexオブジェクトを生成
idx1 = pd.Index([1, 2, 3])

print(idx1)
# Int64Index([1, 2, 3], dtype='int64')

実際には Indexオブジェクトという呼び方は総称であり、要素の型に応じて属するクラスは異なります。上のコードで定義した idx はすべての要素が整数なので、numeric.Int64Indexクラスに属しています。

print(type(idx))
# <class 'pandas.core.indexes.numeric.Int64Index'>

すべての要素が浮動小数点数ならば、numeric.Float64Index クラスのオブジェクトが生成されます:

# In[2]

Indexオブジェクトを生成
idx2 = pd.Index([0.1, 0.2, 0.3])

print(idx2)
print(type(idx2))

# Float64Index([0.1, 0.2, 0.3], dtype='float64')
# <class 'pandas.core.indexes.numeric.Float64Index'>

その他のオブジェクトを渡すと、base.Index クラスのオブジェクトが生成され、データ型 (dtype) は “object” になります。

# In[3]

# Indexオブジェクトを生成
idx3 = pd.Index(["a", "b", "c"])

print(idx3)
print(type(idx3))

# Index(['a', 'b', 'c'], dtype='object')
# <class 'pandas.core.indexes.base.Index'>

pandas.Series() に Indexオブジェクトを渡して Seriesオブジェクトを生成できます。

# In[4]

# Indexを渡してSeriesを生成
pd.Series([10, 20, 30], index=idx3)

# a    10
# b    20
# c    30
# dtype: int64

pandas.DataFrame() の index と columns に Indexオブジェクトを渡して DataFrameオブジェクトを生成できます。

# In[5]

# Indexオブジェクトを生成
idx4 = pd.Index(["a", "b"])
clm = pd.Index([1, 2, 3])

# 2次元配列を定義
x = np.array([[10, 20, 30],
              [40, 50, 60]])

# DataFrameオブジェクトを生成
data = pd.DataFrame(x, index=idx4, columns=clm)

print(data)
#     1   2   3
# a  10  20  30
# b  40  50  60

Index要素へのアクセス

Indexの各要素に対して、リストや配列と同じような方法でアクセスできます。

# PANDAS_INDEX_02

# In[1]

import numpy as np
import pandas as pd

# Indexオブジェクトを生成
idx = pd.Index(["a", "b", "c", "d", "e"])

# idxの4番目の要素を参照
print(idx[3])

# d


# In[2]

# 2~4番目の要素をスライス
print(idx[1:4])

# Index(['b', 'c', 'd'], dtype='object')

Indexの不変性

Index は immutable (変更不能) なオブジェクトです。通常の方法で要素を書き換えることはできません。

# PANDAS_INDEX_03

# In[1]

import numpy as np
import pandas as pd

# Indexオブジェクトを生成
idx = pd.Index(["a", "b", "c", "d", "e"])

idx[2] = 1
# TypeError: Index does not support mutable operations

Indexのデータ属性

NumPy配列と同様に、Indexオブジェクトも size, shape, dtype, ndim, values などのデータ属性を備えています。

# PANDAS_INDEX_04

# In[1]

import numpy as np
import pandas as pd

# Indexオブジェクトを生成
idx = pd.Index([1, 2, 3, 4, 5])

print("要素の数 {}".format(idx.size))
print("形状 {}".format(idx.shape))
print("データ型 {}".format(idx.dtype))
print("次元数 {}".format(idx.ndim))
print("値 {}".format(idx.values))

# 要素の数 5
# 形状 (5,)
# データ型 int64
# 次元数 1
# 値 [1 2 3 4 5]

順序付き集合

Index オブジェクトは 順序付き集合 としての性質を備えており、各種の 集合演算 に対応できます。「&」、「|」、「^」などの記号も使えますが、現在のバージョンの pandas では非推奨となっています。代わりに index.intersection(), index.union(), index.symmetric_difference() を使うように推奨されています。

# PANDAS_INDEX_05

# In[1]

import numpy as np
import pandas as pd

# Indexオブジェクトを生成
idx1 = pd.Index(["a", "b", "c"])
idx2 = pd.Index(["c", "d", "e"])

# 積集合
print("積集合", idx1.intersection(idx2))

# 和集合
print("和集合", idx1.union(idx2))

# 対称差
print("対称差", idx1.symmetric_difference(idx2))
# 積集合 Index(['c'], dtype='object')
# 和集合 Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
# 対称差 Index(['a', 'b', 'd', 'e'], dtype='object')

ただし、Python の setオブジェクトとは異なり、Indexオブジェクトは内部に重複要素を含むことができるので、多重集合 (multiset) とよばれることもあります。

 

コメント

  1. HNaio より:

    下記は誤植と思われますので、ご確認ください。
    INDEX_01 In[1] プログラムで、下記の 2 行の追加。
    import numpy as np
    import pandas as pd
    INDEX_05 In[1] プログラムで、& → intersection( )、| → union( )、^ → symmetric_difference( ) を使うことを推奨するメッセージが表示されました。

    • あとりえこばと より:

      集合演算記号が pandas では非推奨になってたんですね。知りませんでした。推奨されている方式に書き直しておきした。
      最新の情報をありがとうございます。m(_ _)m

  2. あとりえこばと より:

    ChatGPTがpandas.indexについて解説します

    生徒: 先生、pandasのindexについて教えてください。よくわかりません。
    先生: もちろん、indexについて説明しましょう。pandasのindexは、データフレームやシリーズの行のラベルや識別子を格納するオブジェクトです。
    生徒: 行のラベルや識別子を格納するオブジェクトですね。具体的にどういうことですか?
    先生: よく例を見ながら説明しますね。例えば、以下のようなデータフレームを考えましょう

      名前  年齢  性別
    0  太郎   25   男性
    1  花子   30   女性
    2  健太   20   男性

    この場合、0、1、2が行のラベルとして使用されています。このラベルはindexオブジェクトに格納されています。
    生徒: 行のラベルをindexオブジェクトに格納するんですね。
    先生: そうです。indexオブジェクトは、行のラベルを保持するだけでなく、データの結合や操作をする際にも重要な役割を果たします。例えば、データフレームの特定の行にアクセスする際に、その行のラベルをindexを使用して指定することができます。

    生徒: なるほど、データフレームの特定の行にアクセスするときに使うんですね。
    先生: そうです。また、indexオブジェクトは一意な値で構成されることが一般的です。つまり、同じ行ラベルが重複することはありません。これにより、データを一意に識別できます。
    生徒: 重複しない一意な値を使ってデータを識別するんですね。
    先生: 正確に言えば、indexオブジェクトはイミュータブル(変更不可)な性質を持っています。つまり、一度作成されたindexオブジェクトは変更できません。しかし、必要に応じて新しいindexオブジェクトを作成することはできます。