From c9b617bf9770be769050ef035e374b6e3ebb3330 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 24 May 2021 16:25:01 +0100 Subject: [PATCH 1/3] BUG: Series[int].loc setitem with Series[int] results in Series[float] --- pandas/core/dtypes/cast.py | 2 ++ pandas/tests/series/indexing/test_setitem.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index e3616bc857140..bc761df9e7284 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -2179,6 +2179,8 @@ def can_hold_element(arr: ArrayLike, element: Any) -> bool: if dtype.kind in ["i", "u"]: if tipo is not None: if tipo.kind not in ["i", "u"]: + if (is_float(element) and element.is_integer()): + return True # Anything other than integer we cannot hold return False elif dtype.itemsize < tipo.itemsize: diff --git a/pandas/tests/series/indexing/test_setitem.py b/pandas/tests/series/indexing/test_setitem.py index 3f850dfbc6a39..13054062defb4 100644 --- a/pandas/tests/series/indexing/test_setitem.py +++ b/pandas/tests/series/indexing/test_setitem.py @@ -158,7 +158,7 @@ def test_setitem_series_object_dtype(self, indexer, ser_index): expected = Series([Series([42], index=[ser_index]), 0], dtype="object") tm.assert_series_equal(ser, expected) - @pytest.mark.parametrize("index, exp_value", [(0, 42.0), (1, np.nan)]) + @pytest.mark.parametrize("index, exp_value", [(0, 42), (1, np.nan)]) def test_setitem_series(self, index, exp_value): # GH#38303 ser = Series([0, 0]) From 46ee8283a7791e407065fc2713449e9af55cf4d1 Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Mon, 24 May 2021 18:00:49 +0100 Subject: [PATCH 2/3] pre-commit fix --- pandas/core/dtypes/cast.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index bc761df9e7284..29ca7bbfd6b43 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -2179,7 +2179,7 @@ def can_hold_element(arr: ArrayLike, element: Any) -> bool: if dtype.kind in ["i", "u"]: if tipo is not None: if tipo.kind not in ["i", "u"]: - if (is_float(element) and element.is_integer()): + if is_float(element) and element.is_integer(): return True # Anything other than integer we cannot hold return False From f8f9bb5207ca52a9706a8ef87b10cba1b4600cdf Mon Sep 17 00:00:00 2001 From: Simon Hawkins Date: Tue, 1 Jun 2021 14:12:28 +0100 Subject: [PATCH 3/3] remove backport fix --- pandas/core/internals/blocks.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/pandas/core/internals/blocks.py b/pandas/core/internals/blocks.py index 0ab14df9c08c6..786e3c0640960 100644 --- a/pandas/core/internals/blocks.py +++ b/pandas/core/internals/blocks.py @@ -781,14 +781,6 @@ def _replace_list( # so un-tile here return self.replace(src_list, dest_list[0], inplace, regex) - # https://github.com/pandas-dev/pandas/issues/40371 - # the following pairs check code caused a regression so we catch that case here - # until the issue is fixed properly in can_hold_element - - # error: "Iterable[Any]" has no attribute "tolist" - if hasattr(src_list, "tolist"): - src_list = src_list.tolist() # type: ignore[attr-defined] - # Exclude anything that we know we won't contain pairs = [ (x, y) for x, y in zip(src_list, dest_list) if self._can_hold_element(x)