Pandas: `Index`オブジェクトの比較をもっと詳しく!`identical`と`equals`の違いとは?
具体的な動作
- 2つの
Index
オブジェクトの要素の順序が異なる場合、False
を返します。 - 2つの
Index
オブジェクトの要素数が異なる場合、False
を返します。 - 2つの
Index
オブジェクトが同じ要素を持っていても、型が異なる場合、False
を返します。 - 2つの
Index
オブジェクトが同じ要素を持ち、同じ型である場合、True
を返します。
例
import pandas as pd
# 同じ要素を持つIndexオブジェクトを作成
index1 = pd.Index([1, 2, 3])
index2 = pd.Index([1, 2, 3])
# identicalはTrueを返す
print(index1.identical(index2))
# 型が異なるIndexオブジェクトを作成
index3 = pd.Index([1, 2, 3], dtype='object')
# identicalはFalseを返す
print(index1.identical(index3))
# 要素数が異なるIndexオブジェクトを作成
index4 = pd.Index([1, 2])
# identicalはFalseを返す
print(index1.identical(index4))
# 要素の順序が異なるIndexオブジェクトを作成
index5 = pd.Index([3, 2, 1])
# identicalはFalseを返す
print(index1.identical(index5))
- 属性や型の違いも考慮するため、より詳細な比較ができます。
- 2つの
Index
オブジェクトが完全に同じかどうかを厳密に判断できます。
異なるデータ型を持つIndexオブジェクトの比較
import pandas as pd
# 数値型のIndexオブジェクトを作成
index1 = pd.Index([1, 2, 3])
# 文字列型のIndexオブジェクトを作成
index2 = pd.Index(['1', '2', '3'])
# identicalはFalseを返す
print(index1.identical(index2))
多次元Indexオブジェクトの比較
import pandas as pd
# 2次元Indexオブジェクトを作成
index1 = pd.MultiIndex.from_tuples([('A', 1), ('B', 2), ('C', 3)])
index2 = pd.MultiIndex.from_tuples([('A', 1), ('B', 2), ('C', 3)])
# identicalはTrueを返す
print(index1.identical(index2))
# 名前が異なる2次元Indexオブジェクトを作成
index3 = pd.MultiIndex.from_tuples([('A', 1), ('B', 2), ('C', 3)],
names=['name1', 'name2'])
# identicalはFalseを返す
print(index1.identical(index3))
重複を持つIndexオブジェクトの比較
import pandas as pd
# 重複を持つIndexオブジェクトを作成
index1 = pd.Index([1, 2, 2, 3])
index2 = pd.Index([1, 2, 2, 3])
# identicalはTrueを返す
print(index1.identical(index2))
# 重複の有無が異なるIndexオブジェクトを作成
index3 = pd.Index([1, 2, 3, 2])
# identicalはFalseを返す
print(index1.identical(index3))
import pandas as pd
# カスタム属性を持つIndexオブジェクトを作成
index1 = pd.Index([1, 2, 3], name='my_index')
index2 = pd.Index([1, 2, 3], name='my_index')
# identicalはTrueを返す
print(index1.identical(index2))
# カスタム属性名が異なるIndexオブジェクトを作成
index3 = pd.Index([1, 2, 3], name='my_index2')
# identicalはFalseを返す
print(index1.identical(index3))
以下に、pandas.Index.identical
の代替方法をいくつか紹介します。
pandas.Index.equals
pandas.Index.equals
は、pandas.Index.identical
と似ていますが、属性や型は比較しません。要素の値と順序のみを比較します。
import pandas as pd
# 同じ要素を持つIndexオブジェクトを作成
index1 = pd.Index([1, 2, 3])
index2 = pd.Index([1, 2, 3])
# equalsはTrueを返す
print(index1.equals(index2))
pandas.Index.identical
と異なり、pandas.Index.equals
は、属性や型が異なる場合でも、要素の値と順序が同じであればTrue
を返します。
カスタム関数
pandas.Index.identical
のすべての機能を完全に再現する必要がない場合は、カスタム関数を作成することができます。
def is_identical(index1, index2):
if not index1.equals(index2):
return False
if index1.dtype != index2.dtype:
return False
if not hasattr(index1, 'name') or not hasattr(index2, 'name'):
return True
return index1.name == index2.name
# 同じ要素を持つIndexオブジェクトを作成
index1 = pd.Index([1, 2, 3], name='my_index')
index2 = pd.Index([1, 2, 3], name='my_index')
# is_identicalはTrueを返す
print(is_identical(index1, index2))
このカスタム関数は、pandas.Index.identical
と同じように動作しますが、必要に応じてカスタマイズすることができます。
pandas-gbq
やvaex
などのサードパーティライブラリには、pandas.Index.identical
と同様の機能を提供する関数があります。これらのライブラリは、パフォーマンスや機能面で利点がある場合があります。
例:pandas-gbq
import pandas as pd
from pandas_gbq import IndexComparator
# 同じ要素を持つIndexオブジェクトを作成
index1 = pd.Index([1, 2, 3])
index2 = pd.Index([1, 2, 3])
# compare_indexesはTrueを返す
print(IndexComparator().compare_indexes(index1, index2))
例:vaex
import pandas as pd
import vaex as vx
# 同じ要素を持つIndexオブジェクトを作成
index1 = pd.Index([1, 2, 3])
index2 = pd.Index([1, 2, 3])
# is_identicalはTrueを返す
print(vx.Index(index1).is_identical(vx.Index(index2)))
これらのライブラリを使用する前に、ドキュメントをよく読んでください。