diff --git a/pandas/core/frame.py b/pandas/core/frame.py index 49e5bc24786dd..c5d1ade924d15 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -11917,6 +11917,11 @@ def _reindex_for_setitem(value: DataFrame | Series, index: Index) -> ArrayLike: # reindex if necessary if value.index.equals(index) or not len(index): + if isinstance(value, DataFrame): + dtype_list = value.dtypes.unique() + if len(dtype_list) == 1: + dtype = dtype_list[0].name.lower() + return value._values.astype(dtype).copy() return value._values.copy() # GH#4107 diff --git a/pandas/tests/indexing/multiindex/test_multiindex.py b/pandas/tests/indexing/multiindex/test_multiindex.py index 08e15545cb998..bf74a52e81dd3 100644 --- a/pandas/tests/indexing/multiindex/test_multiindex.py +++ b/pandas/tests/indexing/multiindex/test_multiindex.py @@ -227,3 +227,17 @@ def test_multiindex_repeated_keys(self): ], Series([1, 1, 2, 2], MultiIndex.from_arrays([["a", "a", "b", "b"]])), ) + + @pytest.mark.parametrize("data_type", ["int64", "int32", "float64", "float32"]) + def test_multiindex_dataframe_incorrect_type(self, data_type): + # GH 46896 + df = DataFrame( + columns=MultiIndex.from_tuples([("a", "c"), ("a", "d")]), + data=[[1, 2], [3, 4]], + ) + df["a"] = df["a"].astype(data_type) + + result = df.dtypes + expected = Series(data=[data_type, data_type], index=[["a", "a"], ["c", "d"]]) + + tm.assert_series_equal(result, expected)