Skip to content

Commit 4d4bee2

Browse files
committed
Regression: Loc raising when indexing mi with one level (pandas-dev#45785)
1 parent f999142 commit 4d4bee2

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
@@ -2995,6 +2995,10 @@ def _get_loc_level(self, key, level: int | list[int] = 0):
29952995

29962996
# different name to distinguish from maybe_droplevels
29972997
def maybe_mi_droplevels(indexer, levels):
2998+
"""
2999+
If level does not exist or all levels were dropped, the exception
3000+
has to be handled outside.
3001+
"""
29983002
new_index = self[indexer]
29993003

30003004
for i in sorted(levels, reverse=True):
@@ -3128,7 +3132,12 @@ def maybe_mi_droplevels(indexer, levels):
31283132
# e.g. test_partial_string_timestamp_multiindex
31293133
return indexer, self[indexer]
31303134

3131-
return indexer, maybe_mi_droplevels(indexer, [level])
3135+
try:
3136+
result_index = maybe_mi_droplevels(indexer, [level])
3137+
except ValueError:
3138+
result_index = self[indexer]
3139+
3140+
return indexer, result_index
31323141

31333142
def _get_level_indexer(
31343143
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
@@ -1543,6 +1543,18 @@ def test_getitem_preserve_object_index_with_dates(self, indexer):
15431543

15441544
assert ser.index.dtype == object
15451545

1546+
def test_loc_on_multiindex_one_level(self):
1547+
# GH#45779
1548+
df = DataFrame(
1549+
data=[[0], [1]],
1550+
index=MultiIndex.from_tuples([("a",), ("b",)], names=["first"]),
1551+
)
1552+
expected = DataFrame(
1553+
data=[[0]], index=MultiIndex.from_tuples([("a",)], names=["first"])
1554+
)
1555+
result = df.loc["a"]
1556+
tm.assert_frame_equal(result, expected)
1557+
15461558

15471559
class TestDepreactedIndexers:
15481560
@pytest.mark.parametrize(

0 commit comments

Comments
 (0)