test_equals.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. import numpy as np
  2. import pytest
  3. from pandas import (
  4. Categorical,
  5. CategoricalIndex,
  6. Index,
  7. MultiIndex,
  8. )
  9. class TestEquals:
  10. def test_equals_categorical(self):
  11. ci1 = CategoricalIndex(["a", "b"], categories=["a", "b"], ordered=True)
  12. ci2 = CategoricalIndex(["a", "b"], categories=["a", "b", "c"], ordered=True)
  13. assert ci1.equals(ci1)
  14. assert not ci1.equals(ci2)
  15. assert ci1.equals(ci1.astype(object))
  16. assert ci1.astype(object).equals(ci1)
  17. assert (ci1 == ci1).all()
  18. assert not (ci1 != ci1).all()
  19. assert not (ci1 > ci1).all()
  20. assert not (ci1 < ci1).all()
  21. assert (ci1 <= ci1).all()
  22. assert (ci1 >= ci1).all()
  23. assert not (ci1 == 1).all()
  24. assert (ci1 == Index(["a", "b"])).all()
  25. assert (ci1 == ci1.values).all()
  26. # invalid comparisons
  27. with pytest.raises(ValueError, match="Lengths must match"):
  28. ci1 == Index(["a", "b", "c"])
  29. msg = "Categoricals can only be compared if 'categories' are the same"
  30. with pytest.raises(TypeError, match=msg):
  31. ci1 == ci2
  32. with pytest.raises(TypeError, match=msg):
  33. ci1 == Categorical(ci1.values, ordered=False)
  34. with pytest.raises(TypeError, match=msg):
  35. ci1 == Categorical(ci1.values, categories=list("abc"))
  36. # tests
  37. # make sure that we are testing for category inclusion properly
  38. ci = CategoricalIndex(list("aabca"), categories=["c", "a", "b"])
  39. assert not ci.equals(list("aabca"))
  40. # Same categories, but different order
  41. # Unordered
  42. assert ci.equals(CategoricalIndex(list("aabca")))
  43. # Ordered
  44. assert not ci.equals(CategoricalIndex(list("aabca"), ordered=True))
  45. assert ci.equals(ci.copy())
  46. ci = CategoricalIndex(list("aabca") + [np.nan], categories=["c", "a", "b"])
  47. assert not ci.equals(list("aabca"))
  48. assert not ci.equals(CategoricalIndex(list("aabca")))
  49. assert ci.equals(ci.copy())
  50. ci = CategoricalIndex(list("aabca") + [np.nan], categories=["c", "a", "b"])
  51. assert not ci.equals(list("aabca") + [np.nan])
  52. assert ci.equals(CategoricalIndex(list("aabca") + [np.nan]))
  53. assert not ci.equals(CategoricalIndex(list("aabca") + [np.nan], ordered=True))
  54. assert ci.equals(ci.copy())
  55. def test_equals_categorical_unordered(self):
  56. # https://github.com/pandas-dev/pandas/issues/16603
  57. a = CategoricalIndex(["A"], categories=["A", "B"])
  58. b = CategoricalIndex(["A"], categories=["B", "A"])
  59. c = CategoricalIndex(["C"], categories=["B", "A"])
  60. assert a.equals(b)
  61. assert not a.equals(c)
  62. assert not b.equals(c)
  63. def test_equals_non_category(self):
  64. # GH#37667 Case where other contains a value not among ci's
  65. # categories ("D") and also contains np.nan
  66. ci = CategoricalIndex(["A", "B", np.nan, np.nan])
  67. other = Index(["A", "B", "D", np.nan])
  68. assert not ci.equals(other)
  69. def test_equals_multiindex(self):
  70. # dont raise NotImplementedError when calling is_dtype_compat
  71. mi = MultiIndex.from_arrays([["A", "B", "C", "D"], range(4)])
  72. ci = mi.to_flat_index().astype("category")
  73. assert not ci.equals(mi)