From 25105b02bea01dd8fe622985958d9d85a7908580 Mon Sep 17 00:00:00 2001 From: Patrick Hoefler Date: Wed, 21 Sep 2022 14:35:59 +0200 Subject: [PATCH 1/3] REGR: None cast to nan for object dtype when enlarging Series --- doc/source/whatsnew/v1.5.1.rst | 1 + pandas/core/indexing.py | 7 ++++++- pandas/tests/series/indexing/test_setitem.py | 8 ++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v1.5.1.rst b/doc/source/whatsnew/v1.5.1.rst index 9d40d9118db32..6b7d5c72b1aa0 100644 --- a/doc/source/whatsnew/v1.5.1.rst +++ b/doc/source/whatsnew/v1.5.1.rst @@ -14,6 +14,7 @@ including other versions of pandas. Fixed regressions ~~~~~~~~~~~~~~~~~ +- Regression in :meth:`Series.__setitem__` casting ``None`` to ``NaN`` for object dtype (:issue:`50000`) - Regression in :func:`.read_csv` causing an ``EmptyDataError`` when using an UTF-8 file handle that was already read from (:issue:`48646`) - diff --git a/pandas/core/indexing.py b/pandas/core/indexing.py index 37d211d4d3cf0..d948a14d0fa68 100644 --- a/pandas/core/indexing.py +++ b/pandas/core/indexing.py @@ -2112,9 +2112,14 @@ def _setitem_with_indexer_missing(self, indexer, value): # this preserves dtype of the value and of the object if not is_scalar(value): new_dtype = None + elif is_valid_na_for_dtype(value, self.obj.dtype): - value = na_value_for_dtype(self.obj.dtype, compat=False) + if not is_object_dtype(self.obj.dtype): + # Every NA value is suitable for object, no conversion needed + value = na_value_for_dtype(self.obj.dtype, compat=False) + new_dtype = maybe_promote(self.obj.dtype, value)[0] + elif isna(value): new_dtype = None elif not self.obj.empty and not is_object_dtype(self.obj.dtype): diff --git a/pandas/tests/series/indexing/test_setitem.py b/pandas/tests/series/indexing/test_setitem.py index 90051405c6935..65c899082a395 100644 --- a/pandas/tests/series/indexing/test_setitem.py +++ b/pandas/tests/series/indexing/test_setitem.py @@ -562,6 +562,14 @@ def test_setitem_enlarge_with_na(self, na, target_na, dtype, target_dtype, index expected = Series(expected_values, dtype=target_dtype) tm.assert_series_equal(ser, expected) + def test_setitem_enlargement_object_none(self): + # GH# + ser = Series(["a", "b"]) + ser[3] = None + expected = Series(["a", "b", None], index=[0, 1, 3]) + tm.assert_series_equal(ser, expected) + assert ser[3] is None + def test_setitem_scalar_into_readonly_backing_data(): # GH#14359: test that you cannot mutate a read only buffer From c14bfe67aa4eab8b16845de7f08cf11ebbfdcb01 Mon Sep 17 00:00:00 2001 From: Patrick Hoefler Date: Wed, 21 Sep 2022 14:54:37 -0700 Subject: [PATCH 2/3] Add gh ref --- doc/source/whatsnew/v1.5.1.rst | 2 +- pandas/tests/series/indexing/test_setitem.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/source/whatsnew/v1.5.1.rst b/doc/source/whatsnew/v1.5.1.rst index 6b7d5c72b1aa0..70cc682153615 100644 --- a/doc/source/whatsnew/v1.5.1.rst +++ b/doc/source/whatsnew/v1.5.1.rst @@ -14,7 +14,7 @@ including other versions of pandas. Fixed regressions ~~~~~~~~~~~~~~~~~ -- Regression in :meth:`Series.__setitem__` casting ``None`` to ``NaN`` for object dtype (:issue:`50000`) +- Regression in :meth:`Series.__setitem__` casting ``None`` to ``NaN`` for object dtype (:issue:`48665`) - Regression in :func:`.read_csv` causing an ``EmptyDataError`` when using an UTF-8 file handle that was already read from (:issue:`48646`) - diff --git a/pandas/tests/series/indexing/test_setitem.py b/pandas/tests/series/indexing/test_setitem.py index 65c899082a395..6e9902c4480e1 100644 --- a/pandas/tests/series/indexing/test_setitem.py +++ b/pandas/tests/series/indexing/test_setitem.py @@ -563,7 +563,7 @@ def test_setitem_enlarge_with_na(self, na, target_na, dtype, target_dtype, index tm.assert_series_equal(ser, expected) def test_setitem_enlargement_object_none(self): - # GH# + # GH#48665 ser = Series(["a", "b"]) ser[3] = None expected = Series(["a", "b", None], index=[0, 1, 3]) From 17e37de4787ceafa9fb9a9de8ac49693968d2366 Mon Sep 17 00:00:00 2001 From: Patrick Hoefler Date: Thu, 22 Sep 2022 13:39:15 -0700 Subject: [PATCH 3/3] Add fixture --- pandas/tests/series/indexing/test_setitem.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/tests/series/indexing/test_setitem.py b/pandas/tests/series/indexing/test_setitem.py index 6e9902c4480e1..9ab3b6ead017f 100644 --- a/pandas/tests/series/indexing/test_setitem.py +++ b/pandas/tests/series/indexing/test_setitem.py @@ -562,13 +562,13 @@ def test_setitem_enlarge_with_na(self, na, target_na, dtype, target_dtype, index expected = Series(expected_values, dtype=target_dtype) tm.assert_series_equal(ser, expected) - def test_setitem_enlargement_object_none(self): + def test_setitem_enlargement_object_none(self, nulls_fixture): # GH#48665 ser = Series(["a", "b"]) - ser[3] = None - expected = Series(["a", "b", None], index=[0, 1, 3]) + ser[3] = nulls_fixture + expected = Series(["a", "b", nulls_fixture], index=[0, 1, 3]) tm.assert_series_equal(ser, expected) - assert ser[3] is None + assert ser[3] is nulls_fixture def test_setitem_scalar_into_readonly_backing_data():