From 8dd363e09f4d2db774dec32c484d766465eb57d4 Mon Sep 17 00:00:00 2001 From: patrick <61934744+phofl@users.noreply.github.com> Date: Sat, 14 Nov 2020 17:51:57 +0100 Subject: [PATCH 1/2] Fix regression for loc and __setitem__ when one-dimensional tuple was given for MultiIndex (#37787) (cherry picked from commit b80691cce087005d719e4da77e741e8dc3e81e2b) --- doc/source/whatsnew/v1.1.5.rst | 1 + pandas/core/indexing.py | 4 ++-- pandas/tests/indexing/multiindex/test_loc.py | 17 +++++++++++++++++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/doc/source/whatsnew/v1.1.5.rst b/doc/source/whatsnew/v1.1.5.rst index 2a598c489e809..323342cb43950 100644 --- a/doc/source/whatsnew/v1.1.5.rst +++ b/doc/source/whatsnew/v1.1.5.rst @@ -16,6 +16,7 @@ Fixed regressions ~~~~~~~~~~~~~~~~~ - Regression in addition of a timedelta-like scalar to a :class:`DatetimeIndex` raising incorrectly (:issue:`37295`) - Fixed regression in :meth:`Series.groupby` raising when the :class:`Index` of the :class:`Series` had a tuple as its name (:issue:`37755`) +- Fixed regression in :meth:`DataFrame.loc` and :meth:`Series.loc` for ``__setitem__`` when one-dimensional tuple was given to select from :class:`MultiIndex` (:issue:`37711`) - .. --------------------------------------------------------------------------- diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index d21ff6ee17537..c33cb396e576b 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -641,9 +641,9 @@ def _ensure_listlike_indexer(self, key, axis=None): if self.ndim != 2: return - if isinstance(key, tuple): + if isinstance(key, tuple) and not isinstance(self.obj.index, ABCMultiIndex): # key may be a tuple if we are .loc - # in that case, set key to the column part of key + # if index is not a MultiIndex, set key to column part key = key[column_axis] axis = column_axis diff --git a/pandas/tests/indexing/multiindex/test_loc.py b/pandas/tests/indexing/multiindex/test_loc.py index 95a23a9bcf63b..5f78311eabeba 100644 --- a/pandas/tests/indexing/multiindex/test_loc.py +++ b/pandas/tests/indexing/multiindex/test_loc.py @@ -288,6 +288,23 @@ def convert_nested_indexer(indexer_type, keys): tm.assert_series_equal(result, expected) + def test_multiindex_loc_one_dimensional_tuple(self, frame_or_series): + # GH#37711 + mi = MultiIndex.from_tuples([("a", "A"), ("b", "A")]) + obj = frame_or_series([1, 2], index=mi) + obj.loc[("a",)] = 0 + expected = frame_or_series([0, 2], index=mi) + tm.assert_equal(obj, expected) + + @pytest.mark.parametrize("indexer", [("a",), ("a")]) + def test_multiindex_one_dimensional_tuple_columns(self, indexer): + # GH#37711 + mi = MultiIndex.from_tuples([("a", "A"), ("b", "A")]) + obj = DataFrame([1, 2], index=mi) + obj.loc[indexer, :] = 0 + expected = DataFrame([0, 2], index=mi) + tm.assert_frame_equal(obj, expected) + @pytest.mark.parametrize( "indexer, pos", From 4415d429041f77791793f58a60272a4eddd87420 Mon Sep 17 00:00:00 2001 From: phofl Date: Sat, 14 Nov 2020 20:46:29 +0100 Subject: [PATCH 2/2] Fix test for 1.1.5 --- pandas/tests/indexing/multiindex/test_loc.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pandas/tests/indexing/multiindex/test_loc.py b/pandas/tests/indexing/multiindex/test_loc.py index 5f78311eabeba..4ee7e34bc4a0c 100644 --- a/pandas/tests/indexing/multiindex/test_loc.py +++ b/pandas/tests/indexing/multiindex/test_loc.py @@ -288,12 +288,13 @@ def convert_nested_indexer(indexer_type, keys): tm.assert_series_equal(result, expected) - def test_multiindex_loc_one_dimensional_tuple(self, frame_or_series): + @pytest.mark.parametrize("klass", [Series, DataFrame]) + def test_multiindex_loc_one_dimensional_tuple(self, klass): # GH#37711 mi = MultiIndex.from_tuples([("a", "A"), ("b", "A")]) - obj = frame_or_series([1, 2], index=mi) + obj = klass([1, 2], index=mi) obj.loc[("a",)] = 0 - expected = frame_or_series([0, 2], index=mi) + expected = klass([0, 2], index=mi) tm.assert_equal(obj, expected) @pytest.mark.parametrize("indexer", [("a",), ("a")])