diff --git a/pandas/core/frame.py b/pandas/core/frame.py index d80c80fa5d0ab..dbbe2c0751f3a 100644 --- a/pandas/core/frame.py +++ b/pandas/core/frame.py @@ -4757,6 +4757,14 @@ def insert( if not isinstance(loc, int): raise TypeError("loc must be int") + if isinstance(value, DataFrame) and len(value.columns) > 1: + raise ValueError( + f"Expected a one-dimensional object, got a DataFrame with " + f"{len(value.columns)} columns instead." + ) + elif isinstance(value, DataFrame): + value = value.iloc[:, 0] + value = self._sanitize_column(value) self._mgr.insert(loc, column, value) @@ -4843,11 +4851,9 @@ def _sanitize_column(self, value) -> ArrayLike: """ self._ensure_valid_index(value) - # We can get there through isetitem with a DataFrame - # or through loc single_block_path - if isinstance(value, DataFrame): - return _reindex_for_setitem(value, self.index) - elif is_dict_like(value): + # Using a DataFrame would mean coercing values to one dtype + assert not isinstance(value, DataFrame) + if is_dict_like(value): return _reindex_for_setitem(Series(value), self.index) if is_list_like(value): diff --git a/pandas/tests/frame/indexing/test_insert.py b/pandas/tests/frame/indexing/test_insert.py index d084f841f9e19..5d0a51ea0d462 100644 --- a/pandas/tests/frame/indexing/test_insert.py +++ b/pandas/tests/frame/indexing/test_insert.py @@ -100,6 +100,8 @@ def test_insert_frame(self): # GH#42403 df = DataFrame({"col1": [1, 2], "col2": [3, 4]}) - msg = r"Expected a 1D array, got an array with shape \(2, 2\)" + msg = ( + "Expected a one-dimensional object, got a DataFrame with 2 columns instead." + ) with pytest.raises(ValueError, match=msg): df.insert(1, "newcol", df)