diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index fa702770a0990..b8598d1c4a518 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -1085,7 +1085,7 @@ def _convert_to_indexer(self, key, axis: AxisInt): @final def __getitem__(self, key): check_dict_or_set_indexers(key) - if type(key) is tuple: + if isinstance(key, tuple): key = tuple(list(x) if is_iterator(x) else x for x in key) key = tuple(com.apply_if_callable(x, self.obj) for x in key) if self._is_scalar_access(key): diff --git a/pandas/tests/frame/indexing/test_indexing.py b/pandas/tests/frame/indexing/test_indexing.py index c0b04b1f8e80f..5423a7e432113 100644 --- a/pandas/tests/frame/indexing/test_indexing.py +++ b/pandas/tests/frame/indexing/test_indexing.py @@ -1402,6 +1402,25 @@ def test_loc_named_tuple_for_midx(self): ) tm.assert_frame_equal(result, expected) + def test_iloc_named_tuple_for_midx(self): + # GH#48188 + df = DataFrame( + index=MultiIndex.from_product( + [["A", "B"], ["a", "b", "c"]], names=["first", "second"] + ), + columns=["one", "two", "three", "four"], + ) + indexer_tuple = namedtuple("Indexer", df.index.names) + idxr = indexer_tuple(first=[1, 2], second=[2, 3]) + result = df.iloc[idxr] + expected = DataFrame( + index=MultiIndex.from_tuples( + [("A", "b"), ("A", "c")], names=["first", "second"] + ), + columns=["three", "four"], + ) + tm.assert_frame_equal(result, expected) + @pytest.mark.parametrize("indexer", [["a"], "a"]) @pytest.mark.parametrize("col", [{}, {"b": 1}]) def test_set_2d_casting_date_to_int(self, col, indexer):