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-gbqvaexなどのサードパーティライブラリには、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)))

これらのライブラリを使用する前に、ドキュメントをよく読んでください。