Skip to content

Commit ccf8da7

Browse files
phoflmliu08
authored andcommitted
REGR: arithmetic ops recursion error with midx with different dtypes (pandas-dev#49776)
* REGR: arithmetic ops recursion error with midx with different dtypes * Add test
1 parent 88babaf commit ccf8da7

File tree

3 files changed

+24
-1
lines changed

3 files changed

+24
-1
lines changed

doc/source/whatsnew/v1.5.2.rst

+1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ Fixed regressions
1515
~~~~~~~~~~~~~~~~~
1616
- Fixed regression in :meth:`MultiIndex.join` for extension array dtypes (:issue:`49277`)
1717
- Fixed regression in :meth:`Series.replace` raising ``RecursionError`` with numeric dtype and when specifying ``value=None`` (:issue:`45725`)
18+
- Fixed regression in arithmetic operations for :class:`DataFrame` with :class:`MultiIndex` columns with different dtypes (:issue:`49769`)
1819
- Fixed regression in :meth:`DataFrame.plot` preventing :class:`~matplotlib.colors.Colormap` instance
1920
from being passed using the ``colormap`` argument if Matplotlib 3.6+ is used (:issue:`49374`)
2021
- Fixed regression in :func:`date_range` returning an invalid set of periods for ``CustomBusinessDay`` frequency and ``start`` date with timezone (:issue:`49441`)

pandas/core/ops/__init__.py

+3-1
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,9 @@ def should_reindex_frame_op(
338338
left_uniques = left.columns.unique()
339339
right_uniques = right.columns.unique()
340340
cols = left_uniques.intersection(right_uniques)
341-
if len(cols) and not (cols.equals(left_uniques) and cols.equals(right_uniques)):
341+
if len(cols) and not (
342+
len(cols) == len(left_uniques) and len(cols) == len(right_uniques)
343+
):
342344
# TODO: is there a shortcut available when len(cols) == 0?
343345
return True
344346

pandas/tests/frame/test_arithmetic.py

+20
Original file line numberDiff line numberDiff line change
@@ -1133,6 +1133,26 @@ def test_binop_other(self, op, value, dtype, switch_numexpr_min_elements):
11331133
expected = op(df, value).dtypes
11341134
tm.assert_series_equal(result, expected)
11351135

1136+
def test_arithmetic_midx_cols_different_dtypes(self):
1137+
# GH#49769
1138+
midx = MultiIndex.from_arrays([Series([1, 2]), Series([3, 4])])
1139+
midx2 = MultiIndex.from_arrays([Series([1, 2], dtype="Int8"), Series([3, 4])])
1140+
left = DataFrame([[1, 2], [3, 4]], columns=midx)
1141+
right = DataFrame([[1, 2], [3, 4]], columns=midx2)
1142+
result = left - right
1143+
expected = DataFrame([[0, 0], [0, 0]], columns=midx)
1144+
tm.assert_frame_equal(result, expected)
1145+
1146+
def test_arithmetic_midx_cols_different_dtypes_different_order(self):
1147+
# GH#49769
1148+
midx = MultiIndex.from_arrays([Series([1, 2]), Series([3, 4])])
1149+
midx2 = MultiIndex.from_arrays([Series([2, 1], dtype="Int8"), Series([4, 3])])
1150+
left = DataFrame([[1, 2], [3, 4]], columns=midx)
1151+
right = DataFrame([[1, 2], [3, 4]], columns=midx2)
1152+
result = left - right
1153+
expected = DataFrame([[-1, 1], [-1, 1]], columns=midx)
1154+
tm.assert_frame_equal(result, expected)
1155+
11361156

11371157
def test_frame_with_zero_len_series_corner_cases():
11381158
# GH#28600

0 commit comments

Comments
 (0)