Skip to content

Commit

Permalink
Backport PR pandas-dev#54885: REGR: setitem with part of a MultiIndex…
Browse files Browse the repository at this point in the history
… raises
  • Loading branch information
lukemanley authored and meeseeksmachine committed Aug 31, 2023
1 parent 9dc8da8 commit bb99ea0
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 4 deletions.
2 changes: 1 addition & 1 deletion doc/source/whatsnew/v2.1.1.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ including other versions of pandas.

Fixed regressions
~~~~~~~~~~~~~~~~~
-
- Fixed regression in :meth:`DataFrame.__setitem__` raising ``AssertionError`` when setting a :class:`Series` with a partial :class:`MultiIndex` (:issue:`54875`)

.. ---------------------------------------------------------------------------
.. _whatsnew_211.bug_fixes:
Expand Down
6 changes: 3 additions & 3 deletions pandas/core/indexes/multi.py
Original file line number Diff line number Diff line change
Expand Up @@ -2460,12 +2460,12 @@ def _reorder_ilevels(self, order) -> MultiIndex:
def _recode_for_new_levels(
self, new_levels, copy: bool = True
) -> Generator[np.ndarray, None, None]:
if len(new_levels) != self.nlevels:
if len(new_levels) > self.nlevels:
raise AssertionError(
f"Length of new_levels ({len(new_levels)}) "
f"must be same as self.nlevels ({self.nlevels})"
f"must be <= self.nlevels ({self.nlevels})"
)
for i in range(self.nlevels):
for i in range(len(new_levels)):
yield recode_for_categories(
self.codes[i], self.levels[i], new_levels[i], copy=copy
)
Expand Down
18 changes: 18 additions & 0 deletions pandas/tests/indexing/multiindex/test_setitem.py
Original file line number Diff line number Diff line change
Expand Up @@ -556,3 +556,21 @@ def test_frame_setitem_copy_no_write(

result = df
tm.assert_frame_equal(result, expected)


def test_frame_setitem_partial_multiindex():
# GH 54875
df = DataFrame(
{
"a": [1, 2, 3],
"b": [3, 4, 5],
"c": 6,
"d": 7,
}
).set_index(["a", "b", "c"])
ser = Series(8, index=df.index.droplevel("c"))
result = df.copy()
result["d"] = ser
expected = df.copy()
expected["d"] = 8
tm.assert_frame_equal(result, expected)

0 comments on commit bb99ea0

Please sign in to comment.