Skip to content

Commit 46eac3a

Browse files
ENH: Add check_like functionality to assert_series_equal (#47248)
* Add check_like functionality to assert_series_equal * fix code formatting issues * versionadded and whatsnew * fix test comment
1 parent 19b2772 commit 46eac3a

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

doc/source/whatsnew/v1.5.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ Other enhancements
152152
- Added ``numeric_only`` argument to :meth:`Resampler.sum`, :meth:`Resampler.prod`, :meth:`Resampler.min`, :meth:`Resampler.max`, :meth:`Resampler.first`, and :meth:`Resampler.last` (:issue:`46442`)
153153
- ``times`` argument in :class:`.ExponentialMovingWindow` now accepts ``np.timedelta64`` (:issue:`47003`)
154154
- :class:`DataError`, :class:`SpecificationError`, :class:`SettingWithCopyError`, and :class:`SettingWithCopyWarning` are now exposed in ``pandas.errors`` (:issue:`27656`)
155+
- Added ``check_like`` argument to :func:`testing.assert_series_equal` (:issue:`47247`)
155156

156157
.. ---------------------------------------------------------------------------
157158
.. _whatsnew_150.notable_bug_fixes:

pandas/_testing/asserters.py

+13
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,7 @@ def assert_series_equal(
879879
obj="Series",
880880
*,
881881
check_index=True,
882+
check_like=False,
882883
):
883884
"""
884885
Check that left and right Series are equal.
@@ -944,6 +945,11 @@ def assert_series_equal(
944945
Whether to check index equivalence. If False, then compare only values.
945946
946947
.. versionadded:: 1.3.0
948+
check_like : bool, default False
949+
If True, ignore the order of the index. Must be False if check_index is False.
950+
Note: same labels must be with the same data.
951+
952+
.. versionadded:: 1.5.0
947953
948954
Examples
949955
--------
@@ -954,6 +960,9 @@ def assert_series_equal(
954960
"""
955961
__tracebackhide__ = True
956962

963+
if not check_index and check_like:
964+
raise ValueError("check_like must be False if check_index is False")
965+
957966
if check_less_precise is not no_default:
958967
warnings.warn(
959968
"The 'check_less_precise' keyword in testing.assert_*_equal "
@@ -988,11 +997,15 @@ def assert_series_equal(
988997
check_names=check_names,
989998
check_exact=check_exact,
990999
check_categorical=check_categorical,
1000+
check_order=not check_like,
9911001
rtol=rtol,
9921002
atol=atol,
9931003
obj=f"{obj}.index",
9941004
)
9951005

1006+
if check_like:
1007+
left, right = left.reindex_like(right), right
1008+
9961009
if check_freq and isinstance(left.index, (DatetimeIndex, TimedeltaIndex)):
9971010
lidx = left.index
9981011
ridx = right.index

pandas/tests/util/test_assert_series_equal.py

+31
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,37 @@ def test_series_equal_index_dtype(s1, s2, msg, check_index_type):
158158
tm.assert_series_equal(s1, s2, **kwargs)
159159

160160

161+
@pytest.mark.parametrize("check_like", [True, False])
162+
def test_series_equal_order_mismatch(check_like):
163+
s1 = Series([1, 2, 3], index=["a", "b", "c"])
164+
s2 = Series([3, 2, 1], index=["c", "b", "a"])
165+
166+
if not check_like: # Do not ignore index ordering.
167+
with pytest.raises(AssertionError, match="Series.index are different"):
168+
tm.assert_series_equal(s1, s2, check_like=check_like)
169+
else:
170+
_assert_series_equal_both(s1, s2, check_like=check_like)
171+
172+
173+
@pytest.mark.parametrize("check_index", [True, False])
174+
def test_series_equal_index_mismatch(check_index):
175+
s1 = Series([1, 2, 3], index=["a", "b", "c"])
176+
s2 = Series([1, 2, 3], index=["c", "b", "a"])
177+
178+
if check_index: # Do not ignore index.
179+
with pytest.raises(AssertionError, match="Series.index are different"):
180+
tm.assert_series_equal(s1, s2, check_index=check_index)
181+
else:
182+
_assert_series_equal_both(s1, s2, check_index=check_index)
183+
184+
185+
def test_series_invalid_param_combination():
186+
with pytest.raises(
187+
ValueError, match="check_like must be False if check_index is False"
188+
):
189+
tm.assert_series_equal(Series(), Series(), check_index=False, check_like=True)
190+
191+
161192
def test_series_equal_length_mismatch(rtol):
162193
msg = """Series are different
163194

0 commit comments

Comments
 (0)