Skip to content

Commit 00381b6

Browse files
phoflsimonjayhawkins
authored andcommitted
Backport PR pandas-dev#45785: Regression: Loc raising when indexing mi with one level
1 parent 7da7e3a commit 00381b6

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

doc/source/whatsnew/v1.4.1.rst

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ Fixed regressions
1616
~~~~~~~~~~~~~~~~~
1717
- Regression in :meth:`Series.mask` with ``inplace=True`` and ``PeriodDtype`` and an incompatible ``other`` coercing to a common dtype instead of raising (:issue:`45546`)
1818
- Regression in :func:`.assert_frame_equal` not respecting ``check_flags=False`` (:issue:`45554`)
19+
- Regression in :meth:`DataFrame.loc.__getitem__` raising ``ValueError`` when indexing on a :class:`MultiIndex` with one level (:issue:`45779`)
1920
- Regression in :meth:`Series.fillna` with ``downcast=False`` incorrectly downcasting ``object`` dtype (:issue:`45603`)
2021
- Regression in :func:`api.types.is_bool_dtype` raising an ``AttributeError`` when evaluating a categorical :class:`Series` (:issue:`45615`)
2122
- Regression in :meth:`DataFrame.iat` setting values leading to not propagating correctly in subsequent lookups (:issue:`45684`)

pandas/core/indexes/multi.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -2986,6 +2986,10 @@ def _get_loc_level(self, key, level: int | list[int] = 0):
29862986

29872987
# different name to distinguish from maybe_droplevels
29882988
def maybe_mi_droplevels(indexer, levels):
2989+
"""
2990+
If level does not exist or all levels were dropped, the exception
2991+
has to be handled outside.
2992+
"""
29892993
new_index = self[indexer]
29902994

29912995
for i in sorted(levels, reverse=True):
@@ -3119,7 +3123,12 @@ def maybe_mi_droplevels(indexer, levels):
31193123
# e.g. test_partial_string_timestamp_multiindex
31203124
return indexer, self[indexer]
31213125

3122-
return indexer, maybe_mi_droplevels(indexer, [level])
3126+
try:
3127+
result_index = maybe_mi_droplevels(indexer, [level])
3128+
except ValueError:
3129+
result_index = self[indexer]
3130+
3131+
return indexer, result_index
31233132

31243133
def _get_level_indexer(
31253134
self, key, level: int = 0, indexer: Int64Index | None = None

pandas/tests/frame/indexing/test_indexing.py

+12
Original file line numberDiff line numberDiff line change
@@ -1535,6 +1535,18 @@ def test_loc_iloc_setitem_non_categorical_rhs(
15351535
with pytest.raises(TypeError, match=msg1):
15361536
indexer(df)[key] = ["c", "c"]
15371537

1538+
def test_loc_on_multiindex_one_level(self):
1539+
# GH#45779
1540+
df = DataFrame(
1541+
data=[[0], [1]],
1542+
index=MultiIndex.from_tuples([("a",), ("b",)], names=["first"]),
1543+
)
1544+
expected = DataFrame(
1545+
data=[[0]], index=MultiIndex.from_tuples([("a",)], names=["first"])
1546+
)
1547+
result = df.loc["a"]
1548+
tm.assert_frame_equal(result, expected)
1549+
15381550

15391551
class TestDepreactedIndexers:
15401552
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)