Skip to content

Commit 6acf2af

Browse files
REGR: revert behaviour of getitem with assigning with a Series (#37502) (#37514)
1 parent 344fa71 commit 6acf2af

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

doc/source/whatsnew/v1.1.4.rst

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Fixed regressions
2828
- Fixed regression in certain offsets (:meth:`pd.offsets.Day() <pandas.tseries.offsets.Day>` and below) no longer being hashable (:issue:`37267`)
2929
- Fixed regression in :class:`StataReader` which required ``chunksize`` to be manually set when using an iterator to read a dataset (:issue:`37280`)
3030
- Fixed regression in setitem with :meth:`DataFrame.iloc` which raised error when trying to set a value while filtering with a boolean list (:issue:`36741`)
31+
- Fixed regression in setitem with a Series getting aligned before setting the values (:issue:`37427`)
3132
- Fixed regression in :attr:`MultiIndex.is_monotonic_increasing` returning wrong results with ``NaN`` in at least one of the levels (:issue:`37220`)
3233

3334
.. ---------------------------------------------------------------------------

pandas/core/series.py

+17-5
Original file line numberDiff line numberDiff line change
@@ -1037,10 +1037,8 @@ def _set_with_engine(self, key, value):
10371037
def _set_with(self, key, value):
10381038
# other: fancy integer or otherwise
10391039
if isinstance(key, slice):
1040-
# extract_array so that if we set e.g. ser[-5:] = ser[:5]
1041-
# we get the first five values, and not 5 NaNs
10421040
indexer = self.index._convert_slice_indexer(key, kind="getitem")
1043-
self.iloc[indexer] = extract_array(value, extract_numpy=True)
1041+
return self._set_values(indexer, value)
10441042

10451043
else:
10461044
assert not isinstance(key, tuple)
@@ -1058,12 +1056,26 @@ def _set_with(self, key, value):
10581056
# should be caught by the is_bool_indexer check in __setitem__
10591057
if key_type == "integer":
10601058
if not self.index._should_fallback_to_positional():
1061-
self.loc[key] = value
1059+
self._set_labels(key, value)
10621060
else:
1063-
self.iloc[key] = value
1061+
self._set_values(key, value)
10641062
else:
10651063
self.loc[key] = value
10661064

1065+
def _set_labels(self, key, value):
1066+
key = com.asarray_tuplesafe(key)
1067+
indexer: np.ndarray = self.index.get_indexer(key)
1068+
mask = indexer == -1
1069+
if mask.any():
1070+
raise KeyError(f"{key[mask]} not in index")
1071+
self._set_values(indexer, value)
1072+
1073+
def _set_values(self, key, value):
1074+
if isinstance(key, Series):
1075+
key = key._values
1076+
self._mgr = self._mgr.setitem(indexer=key, value=value)
1077+
self._maybe_update_cacher()
1078+
10671079
def _set_value(self, label, value, takeable: bool = False):
10681080
"""
10691081
Quickly set single value at passed label.

pandas/tests/series/indexing/test_getitem.py

+10
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,13 @@ def test_getitem_ndim_deprecated():
137137
s = pd.Series([0, 1])
138138
with tm.assert_produces_warning(FutureWarning):
139139
s[:, None]
140+
141+
142+
def test_getitem_assignment_series_aligment():
143+
# https://github.com/pandas-dev/pandas/issues/37427
144+
# with getitem, when assigning with a Series, it is not first aligned
145+
s = Series(range(10))
146+
idx = np.array([2, 4, 9])
147+
s[idx] = Series([10, 11, 12])
148+
expected = Series([0, 1, 10, 3, 11, 5, 6, 7, 8, 12])
149+
tm.assert_series_equal(s, expected)

0 commit comments

Comments
 (0)