Skip to content

Commit

Permalink
Backport PR #49776 on branch 1.5.x (REGR: arithmetic ops recursion er…
Browse files Browse the repository at this point in the history
…ror with midx with different dtypes) (#49782)

Backport PR #49776: REGR: arithmetic ops recursion error with midx with different dtypes

Co-authored-by: Patrick Hoefler <61934744+phofl@users.noreply.github.com>
  • Loading branch information
meeseeksmachine and phofl committed Nov 19, 2022
1 parent 1616fb3 commit 8c4b559
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 1 deletion.
1 change: 1 addition & 0 deletions doc/source/whatsnew/v1.5.2.rst
Expand Up @@ -15,6 +15,7 @@ Fixed regressions
~~~~~~~~~~~~~~~~~
- Fixed regression in :meth:`MultiIndex.join` for extension array dtypes (:issue:`49277`)
- Fixed regression in :meth:`Series.replace` raising ``RecursionError`` with numeric dtype and when specifying ``value=None`` (:issue:`45725`)
- Fixed regression in arithmetic operations for :class:`DataFrame` with :class:`MultiIndex` columns with different dtypes (:issue:`49769`)
- Fixed regression in :meth:`DataFrame.plot` preventing :class:`~matplotlib.colors.Colormap` instance
from being passed using the ``colormap`` argument if Matplotlib 3.6+ is used (:issue:`49374`)
- Fixed regression in :func:`date_range` returning an invalid set of periods for ``CustomBusinessDay`` frequency and ``start`` date with timezone (:issue:`49441`)
Expand Down
4 changes: 3 additions & 1 deletion pandas/core/ops/__init__.py
Expand Up @@ -334,7 +334,9 @@ def should_reindex_frame_op(
left_uniques = left.columns.unique()
right_uniques = right.columns.unique()
cols = left_uniques.intersection(right_uniques)
if len(cols) and not (cols.equals(left_uniques) and cols.equals(right_uniques)):
if len(cols) and not (
len(cols) == len(left_uniques) and len(cols) == len(right_uniques)
):
# TODO: is there a shortcut available when len(cols) == 0?
return True

Expand Down
20 changes: 20 additions & 0 deletions pandas/tests/frame/test_arithmetic.py
Expand Up @@ -1135,6 +1135,26 @@ def test_binop_other(self, op, value, dtype, switch_numexpr_min_elements):
expected = op(df, value).dtypes
tm.assert_series_equal(result, expected)

def test_arithmetic_midx_cols_different_dtypes(self):
# GH#49769
midx = MultiIndex.from_arrays([Series([1, 2]), Series([3, 4])])
midx2 = MultiIndex.from_arrays([Series([1, 2], dtype="Int8"), Series([3, 4])])
left = DataFrame([[1, 2], [3, 4]], columns=midx)
right = DataFrame([[1, 2], [3, 4]], columns=midx2)
result = left - right
expected = DataFrame([[0, 0], [0, 0]], columns=midx)
tm.assert_frame_equal(result, expected)

def test_arithmetic_midx_cols_different_dtypes_different_order(self):
# GH#49769
midx = MultiIndex.from_arrays([Series([1, 2]), Series([3, 4])])
midx2 = MultiIndex.from_arrays([Series([2, 1], dtype="Int8"), Series([4, 3])])
left = DataFrame([[1, 2], [3, 4]], columns=midx)
right = DataFrame([[1, 2], [3, 4]], columns=midx2)
result = left - right
expected = DataFrame([[-1, 1], [-1, 1]], columns=midx)
tm.assert_frame_equal(result, expected)


def test_frame_with_zero_len_series_corner_cases():
# GH#28600
Expand Down

0 comments on commit 8c4b559

Please sign in to comment.