diff --git a/pandas-stubs/core/frame.pyi b/pandas-stubs/core/frame.pyi index 4eadbf022..c6ad8493b 100644 --- a/pandas-stubs/core/frame.pyi +++ b/pandas-stubs/core/frame.pyi @@ -166,7 +166,9 @@ class _LocIndexerFrame(_LocIndexer): @overload def __getitem__( self, - idx: tuple[int | StrLike | tuple[ScalarT, ...], int | StrLike], + idx: tuple[ + int | StrLike | tuple[Scalar, ...], int | StrLike | tuple[Scalar, ...] + ], ) -> Scalar: ... @overload def __getitem__( diff --git a/pandas-stubs/core/indexing.pyi b/pandas-stubs/core/indexing.pyi index 35a748fcd..a3b517150 100644 --- a/pandas-stubs/core/indexing.pyi +++ b/pandas-stubs/core/indexing.pyi @@ -15,7 +15,7 @@ from pandas._typing import ( ) _IndexSliceTuple: TypeAlias = tuple[ - Union[Index, MaskType, Scalar, list[ScalarT], slice], ... + Union[Index, MaskType, Scalar, list[ScalarT], slice | tuple[Scalar, ...]], ... ] _IndexSliceUnion: TypeAlias = Union[slice, _IndexSliceTuple] diff --git a/tests/test_frame.py b/tests/test_frame.py index 02f45bc1f..72c7360a7 100644 --- a/tests/test_frame.py +++ b/tests/test_frame.py @@ -2319,3 +2319,16 @@ def test_getattr_and_dataframe_groupby() -> None: assert_type(df.groupby("col1").col3.agg([min, max]), pd.DataFrame), pd.DataFrame, ) + + +def test_getsetitem_multiindex() -> None: + # GH 466 + rows = pd.Index(["project A", "project B", "project C"]) + years: tuple[str, ...] = ("Year 1", "Year 2", "Year 3") + quarters: tuple[str, ...] = ("Q1", "Q2", "Q3", "Q4") + index_tuples: list[tuple[str, ...]] = list(itertools.product(years, quarters)) + cols = pd.MultiIndex.from_tuples(index_tuples) + budget = pd.DataFrame(index=rows, columns=cols) + multi_index: tuple[str, str] = ("Year 1", "Q1") + budget.loc["project A", multi_index] = 4700 + check(assert_type(budget.loc["project A", multi_index], Scalar), int)