Skip to content

Commit 05780a7

Browse files
authored
BUG: Respect check_dtype in assert_series_equal (#32757)
1 parent b3a0fe4 commit 05780a7

File tree

4 files changed

+77
-2
lines changed

4 files changed

+77
-2
lines changed

doc/source/whatsnew/v1.1.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,7 @@ Other
401401
- Bug in :meth:`DataFrame.to_records` incorrectly losing timezone information in timezone-aware ``datetime64`` columns (:issue:`32535`)
402402
- Fixed :func:`pandas.testing.assert_series_equal` to correctly raise if left object is a different subclass with ``check_series_type=True`` (:issue:`32670`).
403403
- :meth:`IntegerArray.astype` now supports ``datetime64`` dtype (:issue:32538`)
404+
- Fixed bug in :func:`pandas.testing.assert_series_equal` where dtypes were checked for ``Interval`` and ``ExtensionArray`` operands when ``check_dtype`` was ``False`` (:issue:`32747`)
404405

405406
.. ---------------------------------------------------------------------------
406407

pandas/_testing.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -1160,7 +1160,7 @@ def assert_series_equal(
11601160
f"is not equal to {right._values}."
11611161
)
11621162
raise AssertionError(msg)
1163-
elif is_interval_dtype(left.dtype) or is_interval_dtype(right.dtype):
1163+
elif is_interval_dtype(left.dtype) and is_interval_dtype(right.dtype):
11641164
assert_interval_array_equal(left.array, right.array)
11651165
elif is_categorical_dtype(left.dtype) or is_categorical_dtype(right.dtype):
11661166
_testing.assert_almost_equal(
@@ -1170,7 +1170,7 @@ def assert_series_equal(
11701170
check_dtype=check_dtype,
11711171
obj=str(obj),
11721172
)
1173-
elif is_extension_array_dtype(left.dtype) or is_extension_array_dtype(right.dtype):
1173+
elif is_extension_array_dtype(left.dtype) and is_extension_array_dtype(right.dtype):
11741174
assert_extension_array_equal(left._values, right._values)
11751175
elif needs_i8_conversion(left.dtype) or needs_i8_conversion(right.dtype):
11761176
# DatetimeArray or TimedeltaArray

pandas/tests/util/test_assert_frame_equal.py

+39
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
22

3+
import pandas as pd
34
from pandas import DataFrame
45
import pandas._testing as tm
56

@@ -218,3 +219,41 @@ def test_frame_equal_unicode(df1, df2, msg, by_blocks_fixture, obj_fixture):
218219
msg = msg.format(obj=obj_fixture)
219220
with pytest.raises(AssertionError, match=msg):
220221
tm.assert_frame_equal(df1, df2, by_blocks=by_blocks_fixture, obj=obj_fixture)
222+
223+
224+
def test_assert_frame_equal_extension_dtype_mismatch():
225+
# https://github.com/pandas-dev/pandas/issues/32747
226+
left = DataFrame({"a": [1, 2, 3]}, dtype="Int64")
227+
right = left.astype(int)
228+
229+
msg = (
230+
"Attributes of DataFrame\\.iloc\\[:, 0\\] "
231+
'\\(column name="a"\\) are different\n\n'
232+
'Attribute "dtype" are different\n'
233+
"\\[left\\]: Int64\n"
234+
"\\[right\\]: int[32|64]"
235+
)
236+
237+
tm.assert_frame_equal(left, right, check_dtype=False)
238+
239+
with pytest.raises(AssertionError, match=msg):
240+
tm.assert_frame_equal(left, right, check_dtype=True)
241+
242+
243+
def test_assert_frame_equal_interval_dtype_mismatch():
244+
# https://github.com/pandas-dev/pandas/issues/32747
245+
left = DataFrame({"a": [pd.Interval(0, 1)]}, dtype="interval")
246+
right = left.astype(object)
247+
248+
msg = (
249+
"Attributes of DataFrame\\.iloc\\[:, 0\\] "
250+
'\\(column name="a"\\) are different\n\n'
251+
'Attribute "dtype" are different\n'
252+
"\\[left\\]: interval\\[int64\\]\n"
253+
"\\[right\\]: object"
254+
)
255+
256+
tm.assert_frame_equal(left, right, check_dtype=False)
257+
258+
with pytest.raises(AssertionError, match=msg):
259+
tm.assert_frame_equal(left, right, check_dtype=True)

pandas/tests/util/test_assert_series_equal.py

+35
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
22

3+
import pandas as pd
34
from pandas import Categorical, DataFrame, Series
45
import pandas._testing as tm
56

@@ -196,6 +197,40 @@ def test_series_equal_categorical_mismatch(check_categorical):
196197
_assert_series_equal_both(s1, s2, check_categorical=check_categorical)
197198

198199

200+
def test_assert_series_equal_extension_dtype_mismatch():
201+
# https://github.com/pandas-dev/pandas/issues/32747
202+
left = Series(pd.array([1, 2, 3], dtype="Int64"))
203+
right = left.astype(int)
204+
205+
msg = """Attributes of Series are different
206+
207+
Attribute "dtype" are different
208+
\\[left\\]: Int64
209+
\\[right\\]: int[32|64]"""
210+
211+
tm.assert_series_equal(left, right, check_dtype=False)
212+
213+
with pytest.raises(AssertionError, match=msg):
214+
tm.assert_series_equal(left, right, check_dtype=True)
215+
216+
217+
def test_assert_series_equal_interval_dtype_mismatch():
218+
# https://github.com/pandas-dev/pandas/issues/32747
219+
left = Series([pd.Interval(0, 1)], dtype="interval")
220+
right = left.astype(object)
221+
222+
msg = """Attributes of Series are different
223+
224+
Attribute "dtype" are different
225+
\\[left\\]: interval\\[int64\\]
226+
\\[right\\]: object"""
227+
228+
tm.assert_series_equal(left, right, check_dtype=False)
229+
230+
with pytest.raises(AssertionError, match=msg):
231+
tm.assert_series_equal(left, right, check_dtype=True)
232+
233+
199234
def test_series_equal_series_type():
200235
class MySeries(Series):
201236
pass

0 commit comments

Comments
 (0)