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オブジェクトを作成することはできます。