From 9d1f0af804efdf6498a38d92c50140b63f8e1f0a Mon Sep 17 00:00:00 2001 From: jbrockmendel Date: Tue, 18 Jan 2022 05:25:45 -0800 Subject: [PATCH] Backport PR #45432: REGR: DataFrame(dict) missing columns should not be views --- pandas/core/internals/construction.py | 8 +++++++- pandas/tests/frame/test_constructors.py | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/pandas/core/internals/construction.py b/pandas/core/internals/construction.py index 532309dfc40b3..d14db58540a05 100644 --- a/pandas/core/internals/construction.py +++ b/pandas/core/internals/construction.py @@ -466,7 +466,13 @@ def dict_to_mgr( # GH#1783 nan_dtype = np.dtype("object") val = construct_1d_arraylike_from_scalar(np.nan, len(index), nan_dtype) - arrays.loc[missing] = [val] * missing.sum() + nmissing = missing.sum() + if copy: + rhs = [val] * nmissing + else: + # GH#45369 + rhs = [val.copy() for _ in range(nmissing)] + arrays.loc[missing] = rhs arrays = list(arrays) columns = ensure_index(columns) diff --git a/pandas/tests/frame/test_constructors.py b/pandas/tests/frame/test_constructors.py index 7f030fc11a20b..08027d5807d8e 100644 --- a/pandas/tests/frame/test_constructors.py +++ b/pandas/tests/frame/test_constructors.py @@ -2648,6 +2648,23 @@ def test_error_from_2darray(self, col_a, col_b): with pytest.raises(ValueError, match=msg): DataFrame({"a": col_a, "b": col_b}) + def test_from_dict_with_missing_copy_false(self): + # GH#45369 filled columns should not be views of one another + df = DataFrame(index=[1, 2, 3], columns=["a", "b", "c"], copy=False) + assert not np.shares_memory(df["a"]._values, df["b"]._values) + + df.iloc[0, 0] = 0 + expected = DataFrame( + { + "a": [0, np.nan, np.nan], + "b": [np.nan, np.nan, np.nan], + "c": [np.nan, np.nan, np.nan], + }, + index=[1, 2, 3], + dtype=object, + ) + tm.assert_frame_equal(df, expected) + class TestDataFrameConstructorIndexInference: def test_frame_from_dict_of_series_overlapping_monthly_period_indexes(self):