diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 665333d0d7b4f..adc4b8c003515 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -2004,11 +2004,16 @@ def _setitem_single_column(self, loc: int, value, plane_indexer): if ( isinstance(new_values, np.ndarray) and isinstance(orig_values, np.ndarray) - and np.shares_memory(new_values, orig_values) + and ( + np.shares_memory(new_values, orig_values) + or new_values.shape != orig_values.shape + ) ): # TODO: get something like tm.shares_memory working? # The values were set inplace after all, no need to warn, # e.g. test_rename_nocopy + # In case of enlarging we can not set inplace, so need to + # warn either pass else: warnings.warn( diff --git a/pandas/tests/frame/indexing/test_indexing.py b/pandas/tests/frame/indexing/test_indexing.py index 994181eac8199..edcd577dd948d 100644 --- a/pandas/tests/frame/indexing/test_indexing.py +++ b/pandas/tests/frame/indexing/test_indexing.py @@ -1307,6 +1307,16 @@ def test_loc_setitem_rhs_frame(self, idxr, val): expected = DataFrame({"a": [np.nan, val]}) tm.assert_frame_equal(df, expected) + @td.skip_array_manager_invalid_test + def test_iloc_setitem_enlarge_no_warning(self): + # GH#47381 + df = DataFrame(columns=["a", "b"]) + expected = df.copy() + view = df[:] + with tm.assert_produces_warning(None): + df.iloc[:, 0] = np.array([1, 2], dtype=np.float64) + tm.assert_frame_equal(view, expected) + class TestDataFrameIndexingUInt64: def test_setitem(self, uint64_frame): diff --git a/pandas/tests/frame/indexing/test_setitem.py b/pandas/tests/frame/indexing/test_setitem.py index 9e9310d735f6a..45f36834510ed 100644 --- a/pandas/tests/frame/indexing/test_setitem.py +++ b/pandas/tests/frame/indexing/test_setitem.py @@ -806,9 +806,7 @@ def test_setitem_string_column_numpy_dtype_raising(self): def test_setitem_empty_df_duplicate_columns(self): # GH#38521 df = DataFrame(columns=["a", "b", "b"], dtype="float64") - msg = "will attempt to set the values inplace instead" - with tm.assert_produces_warning(FutureWarning, match=msg): - df.loc[:, "a"] = list(range(2)) + df.loc[:, "a"] = list(range(2)) expected = DataFrame( [[0, np.nan, np.nan], [1, np.nan, np.nan]], columns=["a", "b", "b"] )