diff --git a/doc/source/reference/indexing.rst b/doc/source/reference/indexing.rst index d3f9413dae565..8446b384b8fb8 100644 --- a/doc/source/reference/indexing.rst +++ b/doc/source/reference/indexing.rst @@ -290,6 +290,7 @@ MultiIndex properties MultiIndex.codes MultiIndex.nlevels MultiIndex.levshape + MultiIndex.dtypes MultiIndex components ~~~~~~~~~~~~~~~~~~~~~ diff --git a/doc/source/whatsnew/v1.3.0.rst b/doc/source/whatsnew/v1.3.0.rst index b40f012f034b6..e62c7a0073dcf 100644 --- a/doc/source/whatsnew/v1.3.0.rst +++ b/doc/source/whatsnew/v1.3.0.rst @@ -19,7 +19,7 @@ Enhancements Other enhancements ^^^^^^^^^^^^^^^^^^ -- +- Added :meth:`MultiIndex.dtypes` (:issue:`37062`) - .. --------------------------------------------------------------------------- diff --git a/pandas/core/indexes/multi.py b/pandas/core/indexes/multi.py index a9d93f473e0e1..c9f83a41042a3 100644 --- a/pandas/core/indexes/multi.py +++ b/pandas/core/indexes/multi.py @@ -701,6 +701,15 @@ def array(self): "'MultiIndex.to_numpy()' to get a NumPy array of tuples." ) + @cache_readonly + def dtypes(self) -> "Series": + """ + Return the dtypes as a Series for the underlying MultiIndex + """ + from pandas import Series + + return Series({level.name: level.dtype for level in self.levels}) + @property def shape(self) -> Shape: """ diff --git a/pandas/tests/indexes/multi/test_get_set.py b/pandas/tests/indexes/multi/test_get_set.py index 63dd1b575284c..83cebf90623fe 100644 --- a/pandas/tests/indexes/multi/test_get_set.py +++ b/pandas/tests/indexes/multi/test_get_set.py @@ -1,6 +1,8 @@ import numpy as np import pytest +from pandas.core.dtypes.dtypes import DatetimeTZDtype + import pandas as pd from pandas import CategoricalIndex, MultiIndex import pandas._testing as tm @@ -27,6 +29,22 @@ def test_get_level_number_integer(idx): idx._get_level_number("fourth") +def test_get_dtypes(): + # Test MultiIndex.dtypes (# Gh37062) + idx_multitype = MultiIndex.from_product( + [[1, 2, 3], ["a", "b", "c"], pd.date_range("20200101", periods=2, tz="UTC")], + names=["int", "string", "dt"], + ) + expected = pd.Series( + { + "int": np.dtype("int64"), + "string": np.dtype("O"), + "dt": DatetimeTZDtype(tz="utc"), + } + ) + tm.assert_series_equal(expected, idx_multitype.dtypes) + + def test_get_level_number_out_of_bounds(multiindex_dataframe_random_data): frame = multiindex_dataframe_random_data