Skip to content

Commit 4071c3b

Browse files
authored
Re-use iloc, loc instead of set_labels, set_values (#33643)
1 parent 0570237 commit 4071c3b

File tree

3 files changed

+11
-21
lines changed

3 files changed

+11
-21
lines changed

pandas/core/indexing.py

+2
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,8 @@ def _get_setitem_indexer(self, key):
616616
# invalid indexer type vs 'other' indexing errors
617617
if "cannot do" in str(e):
618618
raise
619+
elif "unhashable type" in str(e):
620+
raise
619621
raise IndexingError(key) from e
620622

621623
def _ensure_listlike_indexer(self, key, axis=None):

pandas/core/series.py

+7-19
Original file line numberDiff line numberDiff line change
@@ -1031,7 +1031,7 @@ def __setitem__(self, key, value):
10311031
try:
10321032
self._where(~key, value, inplace=True)
10331033
except InvalidIndexError:
1034-
self._set_values(key.astype(np.bool_), value)
1034+
self.iloc[key] = value
10351035
return
10361036

10371037
else:
@@ -1049,8 +1049,10 @@ def _set_with_engine(self, key, value):
10491049
def _set_with(self, key, value):
10501050
# other: fancy integer or otherwise
10511051
if isinstance(key, slice):
1052+
# extract_array so that if we set e.g. ser[-5:] = ser[:5]
1053+
# we get the first five values, and not 5 NaNs
10521054
indexer = self.index._convert_slice_indexer(key, kind="getitem")
1053-
return self._set_values(indexer, value)
1055+
self.iloc[indexer] = extract_array(value, extract_numpy=True)
10541056

10551057
else:
10561058
assert not isinstance(key, tuple)
@@ -1068,25 +1070,11 @@ def _set_with(self, key, value):
10681070
# should be caught by the is_bool_indexer check in __setitem__
10691071
if key_type == "integer":
10701072
if not self.index._should_fallback_to_positional():
1071-
self._set_labels(key, value)
1073+
self.loc[key] = value
10721074
else:
1073-
self._set_values(key, value)
1075+
self.iloc[key] = value
10741076
else:
1075-
self._set_labels(key, value)
1076-
1077-
def _set_labels(self, key, value):
1078-
key = com.asarray_tuplesafe(key)
1079-
indexer: np.ndarray = self.index.get_indexer(key)
1080-
mask = indexer == -1
1081-
if mask.any():
1082-
raise ValueError(f"{key[mask]} not contained in the index")
1083-
self._set_values(indexer, value)
1084-
1085-
def _set_values(self, key, value):
1086-
if isinstance(key, Series):
1087-
key = key._values
1088-
self._mgr = self._mgr.setitem(indexer=key, value=value)
1089-
self._maybe_update_cacher()
1077+
self.loc[key] = value
10901078

10911079
def _set_value(self, label, value, takeable: bool = False):
10921080
"""

pandas/tests/series/indexing/test_loc.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ def test_basic_setitem_with_labels(datetime_series):
131131

132132
inds_notfound = [0, 4, 5, 6]
133133
arr_inds_notfound = np.array([0, 4, 5, 6])
134-
msg = r"\[5\] not contained in the index"
135-
with pytest.raises(ValueError, match=msg):
134+
msg = r"\[5\] not in index"
135+
with pytest.raises(KeyError, match=msg):
136136
s[inds_notfound] = 0
137137
with pytest.raises(Exception, match=msg):
138138
s[arr_inds_notfound] = 0

0 commit comments

Comments
 (0)