Skip to content

Commit 7313da5

Browse files
Backport PR #48215 on branch 1.5.x (REGR: properly update DataFrame cache in Series.__setitem__) (#48268)
Backport PR #48215: REGR: properly update DataFrame cache in Series.__setitem__ Co-authored-by: Joris Van den Bossche <[email protected]>
1 parent 9b4eb54 commit 7313da5

File tree

3 files changed

+20
-1
lines changed

3 files changed

+20
-1
lines changed

doc/source/whatsnew/v1.4.4.rst

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ Fixed regressions
2626
- Fixed regression in :meth:`DataFrame.loc` setting a length-1 array like value to a single value in the DataFrame (:issue:`46268`)
2727
- Fixed regression when slicing with :meth:`DataFrame.loc` with :class:`DateOffset`-index (:issue:`46671`)
2828
- Fixed regression in setting ``None`` or non-string value into a ``string``-dtype Series using a mask (:issue:`47628`)
29+
- Fixed regression in updating a DataFrame column through Series ``__setitem__`` (using chained assignment) not updating column values inplace and using too much memory (:issue:`47172`)
2930
- Fixed regression in :meth:`DataFrame.select_dtypes` returning a view on the original DataFrame (:issue:`48090`)
3031
- Fixed regression using custom Index subclasses (for example, used in xarray) with :meth:`~DataFrame.reset_index` or :meth:`Index.insert` (:issue:`47071`)
3132
- Fixed regression in :meth:`DatetimeIndex.intersection` when the :class:`DatetimeIndex` has dates crossing daylight savings time (:issue:`46702`)

pandas/core/series.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1169,7 +1169,7 @@ def __setitem__(self, key, value) -> None:
11691169
self._set_with(key, value)
11701170

11711171
if cacher_needs_updating:
1172-
self._maybe_update_cacher()
1172+
self._maybe_update_cacher(inplace=True)
11731173

11741174
def _set_with_engine(self, key, value) -> None:
11751175
loc = self.index.get_loc(key)

pandas/tests/frame/indexing/test_setitem.py

+18
Original file line numberDiff line numberDiff line change
@@ -1235,3 +1235,21 @@ def test_setitem_not_operating_inplace(self, value, set_value, indexer):
12351235
view = df[:]
12361236
df[indexer] = set_value
12371237
tm.assert_frame_equal(view, expected)
1238+
1239+
@td.skip_array_manager_invalid_test
1240+
def test_setitem_column_update_inplace(self, using_copy_on_write):
1241+
# https://github.com/pandas-dev/pandas/issues/47172
1242+
1243+
labels = [f"c{i}" for i in range(10)]
1244+
df = DataFrame({col: np.zeros(len(labels)) for col in labels}, index=labels)
1245+
values = df._mgr.blocks[0].values
1246+
1247+
for label in df.columns:
1248+
df[label][label] = 1
1249+
1250+
if not using_copy_on_write:
1251+
# diagonal values all updated
1252+
assert np.all(values[np.arange(10), np.arange(10)] == 1)
1253+
else:
1254+
# original dataframe not updated
1255+
assert np.all(values[np.arange(10), np.arange(10)] == 0)

0 commit comments

Comments
 (0)