【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) とよばれることもあります。
下記は誤植と思われますので、ご確認ください。
INDEX_01 In[1] プログラムで、下記の 2 行の追加。
import numpy as np
import pandas as pd
INDEX_05 In[1] プログラムで、& → intersection( )、| → union( )、^ → symmetric_difference( ) を使うことを推奨するメッセージが表示されました。
集合演算記号が pandas では非推奨になってたんですね。知りませんでした。推奨されている方式に書き直しておきした。
最新の情報をありがとうございます。m(_ _)m
ChatGPTがpandas.indexについて解説します
生徒: 先生、pandasのindexについて教えてください。よくわかりません。
先生: もちろん、indexについて説明しましょう。pandasのindexは、データフレームやシリーズの行のラベルや識別子を格納するオブジェクトです。
生徒: 行のラベルや識別子を格納するオブジェクトですね。具体的にどういうことですか?
先生: よく例を見ながら説明しますね。例えば、以下のようなデータフレームを考えましょう
この場合、0、1、2が行のラベルとして使用されています。このラベルはindexオブジェクトに格納されています。
生徒: なるほど、行のラベルをindexオブジェクトに格納するんですね。
先生: そうです。indexオブジェクトは、行のラベルを保持するだけでなく、データの結合や操作をする際にも重要な役割を果たします。例えば、データフレームの特定の行にアクセスする際に、その行のラベルをindexを使用して指定することができます。
生徒: なるほど、データフレームの特定の行にアクセスするときに使うんですね。
先生: そうです。また、indexオブジェクトは一意な値で構成されることが一般的です。つまり、同じ行ラベルが重複することはありません。これにより、データを一意に識別できます。
生徒: なるほど、重複しない一意な値を使ってデータを識別するんですね。
先生: 正確に言えば、indexオブジェクトはイミュータブル(変更不可)な性質を持っています。つまり、一度作成されたindexオブジェクトは変更できません。しかし、必要に応じて新しいindexオブジェクトを作成することはできます。