Skip to content

Commit 28bf7f2

Browse files
authored
ENH: raise_assert_detail shows the difference between the columns (#48390)
* show first diff in assert_frame_equal * reword diff -> first_diff
1 parent fe9e5d0 commit 28bf7f2

File tree

4 files changed

+13
-3
lines changed

4 files changed

+13
-3
lines changed

doc/source/whatsnew/v1.6.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ enhancement2
2929
Other enhancements
3030
^^^^^^^^^^^^^^^^^^
3131
- :meth:`Series.add_suffix`, :meth:`DataFrame.add_suffix`, :meth:`Series.add_prefix` and :meth:`DataFrame.add_prefix` support an ``axis`` argument. If ``axis`` is set, the default behaviour of which axis to consider can be overwritten (:issue:`47819`)
32+
- :func:`assert_frame_equal` now shows the first element where the DataFrames differ, analogously to ``pytest``'s output (:issue:`47910`)
3233
-
3334

3435
.. ---------------------------------------------------------------------------

pandas/_libs/testing.pyx

+4-1
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ cpdef assert_almost_equal(a, b,
9191
Py_ssize_t i, na, nb
9292
double fa, fb
9393
bint is_unequal = False, a_is_ndarray, b_is_ndarray
94+
str first_diff = ''
9495

9596
if lobj is None:
9697
lobj = a
@@ -159,12 +160,14 @@ cpdef assert_almost_equal(a, b,
159160
except AssertionError:
160161
is_unequal = True
161162
diff += 1
163+
if not first_diff:
164+
first_diff = f"At positional index {i}, first diff: {a[i]} != {b[i]}"
162165

163166
if is_unequal:
164167
from pandas._testing import raise_assert_detail
165168
msg = (f"{obj} values are different "
166169
f"({np.round(diff * 100.0 / na, 5)} %)")
167-
raise_assert_detail(obj, msg, lobj, robj, index_values=index_values)
170+
raise_assert_detail(obj, msg, lobj, robj, first_diff=first_diff, index_values=index_values)
168171

169172
return True
170173

pandas/_testing/asserters.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,9 @@ def assert_timedelta_array_equal(
639639
assert_attr_equal("freq", left, right, obj=obj)
640640

641641

642-
def raise_assert_detail(obj, message, left, right, diff=None, index_values=None):
642+
def raise_assert_detail(
643+
obj, message, left, right, diff=None, first_diff=None, index_values=None
644+
):
643645
__tracebackhide__ = True
644646

645647
msg = f"""{obj} are different
@@ -674,6 +676,9 @@ def raise_assert_detail(obj, message, left, right, diff=None, index_values=None)
674676
if diff is not None:
675677
msg += f"\n[diff]: {diff}"
676678

679+
if first_diff is not None:
680+
msg += f"\n{first_diff}"
681+
677682
raise AssertionError(msg)
678683

679684

pandas/tests/util/test_assert_frame_equal.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,8 @@ def test_frame_equal_index_mismatch(check_like, obj_fixture):
151151
152152
{obj_fixture}\\.index values are different \\(33\\.33333 %\\)
153153
\\[left\\]: Index\\(\\['a', 'b', 'c'\\], dtype='object'\\)
154-
\\[right\\]: Index\\(\\['a', 'b', 'd'\\], dtype='object'\\)"""
154+
\\[right\\]: Index\\(\\['a', 'b', 'd'\\], dtype='object'\\)
155+
At positional index 2, first diff: c != d"""
155156

156157
df1 = DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}, index=["a", "b", "c"])
157158
df2 = DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}, index=["a", "b", "d"])

0 commit comments

Comments
 (0)