Skip to content

Commit f79468b

Browse files
authored
BUG: at/iat __setitem__ failing to cast (#39582)
1 parent ae0d302 commit f79468b

File tree

3 files changed

+16
-9
lines changed

3 files changed

+16
-9
lines changed

doc/source/whatsnew/v1.3.0.rst

+2
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,8 @@ Indexing
341341
- Bug in incorrectly raising in :meth:`Index.insert`, when setting a new column that cannot be held in the existing ``frame.columns``, or in :meth:`Series.reset_index` or :meth:`DataFrame.reset_index` instead of casting to a compatible dtype (:issue:`39068`)
342342
- Bug in :meth:`RangeIndex.append` where a single object of length 1 was concatenated incorrectly (:issue:`39401`)
343343
- Bug in setting ``numpy.timedelta64`` values into an object-dtype :class:`Series` using a boolean indexer (:issue:`39488`)
344+
- Bug in setting numeric values into a into a boolean-dtypes :class:`Series` using ``at`` or ``iat`` failing to cast to object-dtype (:issue:`39582`)
345+
-
344346

345347
Missing
346348
^^^^^^^

pandas/core/series.py

+9-9
Original file line numberDiff line numberDiff line change
@@ -1043,17 +1043,17 @@ def _set_value(self, label, value, takeable: bool = False):
10431043
Scalar value.
10441044
takeable : interpret the index as indexers, default False
10451045
"""
1046-
try:
1047-
if takeable:
1048-
self._values[label] = value
1049-
else:
1046+
if not takeable:
1047+
try:
10501048
loc = self.index.get_loc(label)
1051-
validate_numeric_casting(self.dtype, value)
1052-
self._values[loc] = value
1053-
except KeyError:
1049+
except KeyError:
1050+
# set using a non-recursive method
1051+
self.loc[label] = value
1052+
return
1053+
else:
1054+
loc = label
10541055

1055-
# set using a non-recursive method
1056-
self.loc[label] = value
1056+
self._set_values(loc, value)
10571057

10581058
# ----------------------------------------------------------------------
10591059
# Unsorted

pandas/tests/series/indexing/test_setitem.py

+5
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,11 @@ def test_int_key(self, obj, key, expected, val, indexer_sli):
326326

327327
self.check_indexer(obj, key, expected, val, indexer_sli)
328328

329+
if indexer_sli is tm.loc:
330+
self.check_indexer(obj, key, expected, val, tm.at)
331+
elif indexer_sli is tm.iloc:
332+
self.check_indexer(obj, key, expected, val, tm.iat)
333+
329334
rng = range(key, key + 1)
330335
self.check_indexer(obj, rng, expected, val, indexer_sli)
331336

0 commit comments

Comments
 (0)