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