From a7bda745158d52ad67ba9210b9f7ee152ec67600 Mon Sep 17 00:00:00 2001 From: Rushabh Vasani Date: Sun, 26 Jan 2020 21:55:19 +0530 Subject: [PATCH 1/6] add .item() to__iter__ and add tests --- pandas/core/arrays/masked.py | 2 +- pandas/tests/arrays/test_integer.py | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/pandas/core/arrays/masked.py b/pandas/core/arrays/masked.py index 5eaed70721592..723bd04fed58a 100644 --- a/pandas/core/arrays/masked.py +++ b/pandas/core/arrays/masked.py @@ -45,7 +45,7 @@ def __iter__(self): if self._mask[i]: yield self.dtype.na_value else: - yield self._data[i] + yield self._data[i].item() def __len__(self) -> int: return len(self._data) diff --git a/pandas/tests/arrays/test_integer.py b/pandas/tests/arrays/test_integer.py index 96e676018a0d6..cfb437833f4af 100644 --- a/pandas/tests/arrays/test_integer.py +++ b/pandas/tests/arrays/test_integer.py @@ -771,6 +771,26 @@ def test_integer_array_constructor_copy(): assert result._mask is not mask +def test_integer_Series_iter_return_native(): + expected = int + result = type(pd.Series([1, 2], dtype='int64').tolist()[0]) + assert expected == result + result = type(pd.Series([1, 2], dtype='Int64').tolist()[0]) + assert expected == result + result = type(pd.Series([1, 2], dtype='int64').to_dict()[0]) + assert expected == result + result = type(pd.Series([1, 2], dtype='Int64').to_dict()[0]) + assert expected == result + result = type(list(pd.Series([1, 2], dtype='int64').iteritems())[0][1]) + assert expected == result + result = type(list(pd.Series([1, 2], dtype='Int64').iteritems())[0][1]) + assert expected == result + result = type(list(iter(pd.Series([1, 2], dtype='int64')))[0]) + assert expected == result + result = type(list(iter(pd.Series([1, 2], dtype='Int64')))[0]) + assert expected == result + + @pytest.mark.parametrize( "values", [ From 0b01aceb1e7967730684306d0db5227330bb56c7 Mon Sep 17 00:00:00 2001 From: Rushabh Vasani Date: Sun, 26 Jan 2020 21:58:31 +0530 Subject: [PATCH 2/6] rum black pandas --- pandas/tests/arrays/test_integer.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pandas/tests/arrays/test_integer.py b/pandas/tests/arrays/test_integer.py index cfb437833f4af..86e39165f9de0 100644 --- a/pandas/tests/arrays/test_integer.py +++ b/pandas/tests/arrays/test_integer.py @@ -773,21 +773,21 @@ def test_integer_array_constructor_copy(): def test_integer_Series_iter_return_native(): expected = int - result = type(pd.Series([1, 2], dtype='int64').tolist()[0]) + result = type(pd.Series([1, 2], dtype="int64").tolist()[0]) assert expected == result - result = type(pd.Series([1, 2], dtype='Int64').tolist()[0]) + result = type(pd.Series([1, 2], dtype="Int64").tolist()[0]) assert expected == result - result = type(pd.Series([1, 2], dtype='int64').to_dict()[0]) + result = type(pd.Series([1, 2], dtype="int64").to_dict()[0]) assert expected == result - result = type(pd.Series([1, 2], dtype='Int64').to_dict()[0]) + result = type(pd.Series([1, 2], dtype="Int64").to_dict()[0]) assert expected == result - result = type(list(pd.Series([1, 2], dtype='int64').iteritems())[0][1]) + result = type(list(pd.Series([1, 2], dtype="int64").iteritems())[0][1]) assert expected == result - result = type(list(pd.Series([1, 2], dtype='Int64').iteritems())[0][1]) + result = type(list(pd.Series([1, 2], dtype="Int64").iteritems())[0][1]) assert expected == result - result = type(list(iter(pd.Series([1, 2], dtype='int64')))[0]) + result = type(list(iter(pd.Series([1, 2], dtype="int64")))[0]) assert expected == result - result = type(list(iter(pd.Series([1, 2], dtype='Int64')))[0]) + result = type(list(iter(pd.Series([1, 2], dtype="Int64")))[0]) assert expected == result From 735224a08b6c8b76e4ab258ac5c8cb32b4ca40db Mon Sep 17 00:00:00 2001 From: Rushabh Vasani Date: Sun, 26 Jan 2020 23:50:42 +0530 Subject: [PATCH 3/6] add __iter__ to IntegerArray --- pandas/core/arrays/integer.py | 7 +++++++ pandas/core/arrays/masked.py | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/pandas/core/arrays/integer.py b/pandas/core/arrays/integer.py index 022e6a7322872..ba3464d3f5b1f 100644 --- a/pandas/core/arrays/integer.py +++ b/pandas/core/arrays/integer.py @@ -344,6 +344,13 @@ def __init__(self, values, mask, copy=False): self._data = values self._mask = mask + def __iter__(self): + for i in range(len(self)): + if self._mask[i]: + yield self.dtype.na_value + else: + yield self._data[i].item() + @classmethod def _from_sequence(cls, scalars, dtype=None, copy=False): return integer_array(scalars, dtype=dtype, copy=copy) diff --git a/pandas/core/arrays/masked.py b/pandas/core/arrays/masked.py index 723bd04fed58a..5eaed70721592 100644 --- a/pandas/core/arrays/masked.py +++ b/pandas/core/arrays/masked.py @@ -45,7 +45,7 @@ def __iter__(self): if self._mask[i]: yield self.dtype.na_value else: - yield self._data[i].item() + yield self._data[i] def __len__(self) -> int: return len(self._data) From 9dac00784102e21fcecd9d90a36b49cc17f461e0 Mon Sep 17 00:00:00 2001 From: Rushabh Vasani Date: Sun, 9 Feb 2020 10:24:59 +0530 Subject: [PATCH 4/6] use isinstance --- pandas/tests/arrays/test_integer.py | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/pandas/tests/arrays/test_integer.py b/pandas/tests/arrays/test_integer.py index 86e39165f9de0..73c1cf12fb5b1 100644 --- a/pandas/tests/arrays/test_integer.py +++ b/pandas/tests/arrays/test_integer.py @@ -772,23 +772,14 @@ def test_integer_array_constructor_copy(): def test_integer_Series_iter_return_native(): - expected = int - result = type(pd.Series([1, 2], dtype="int64").tolist()[0]) - assert expected == result - result = type(pd.Series([1, 2], dtype="Int64").tolist()[0]) - assert expected == result - result = type(pd.Series([1, 2], dtype="int64").to_dict()[0]) - assert expected == result - result = type(pd.Series([1, 2], dtype="Int64").to_dict()[0]) - assert expected == result - result = type(list(pd.Series([1, 2], dtype="int64").iteritems())[0][1]) - assert expected == result - result = type(list(pd.Series([1, 2], dtype="Int64").iteritems())[0][1]) - assert expected == result - result = type(list(iter(pd.Series([1, 2], dtype="int64")))[0]) - assert expected == result - result = type(list(iter(pd.Series([1, 2], dtype="Int64")))[0]) - assert expected == result + assert isinstance(pd.Series([1, 2], dtype="int64").tolist()[0], int) + assert isinstance(pd.Series([1, 2], dtype="Int64").tolist()[0], int) + assert isinstance(pd.Series([1, 2], dtype="int64").to_dict()[0], int) + assert isinstance(pd.Series([1, 2], dtype="Int64").to_dict()[0], int) + assert isinstance(list(pd.Series([1, 2], dtype="int64").iteritems())[0][1], int) + assert isinstance(list(pd.Series([1, 2], dtype="Int64").iteritems())[0][1], int) + assert isinstance(list(iter(pd.Series([1, 2], dtype="int64")))[0], int) + assert isinstance(list(iter(pd.Series([1, 2], dtype="Int64")))[0], int) @pytest.mark.parametrize( From b098f4f70872c5a8f67535b5cd00b27e1fde8000 Mon Sep 17 00:00:00 2001 From: Rushabh Vasani Date: Sun, 9 Feb 2020 16:38:53 +0530 Subject: [PATCH 5/6] parametrize --- pandas/tests/arrays/test_integer.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/pandas/tests/arrays/test_integer.py b/pandas/tests/arrays/test_integer.py index 73c1cf12fb5b1..e9082ff4d4027 100644 --- a/pandas/tests/arrays/test_integer.py +++ b/pandas/tests/arrays/test_integer.py @@ -771,15 +771,22 @@ def test_integer_array_constructor_copy(): assert result._mask is not mask -def test_integer_Series_iter_return_native(): - assert isinstance(pd.Series([1, 2], dtype="int64").tolist()[0], int) - assert isinstance(pd.Series([1, 2], dtype="Int64").tolist()[0], int) - assert isinstance(pd.Series([1, 2], dtype="int64").to_dict()[0], int) - assert isinstance(pd.Series([1, 2], dtype="Int64").to_dict()[0], int) - assert isinstance(list(pd.Series([1, 2], dtype="int64").iteritems())[0][1], int) - assert isinstance(list(pd.Series([1, 2], dtype="Int64").iteritems())[0][1], int) - assert isinstance(list(iter(pd.Series([1, 2], dtype="int64")))[0], int) - assert isinstance(list(iter(pd.Series([1, 2], dtype="Int64")))[0], int) +@pytest.mark.parametrize( + "data", + [ + pd.Series([1, 2], dtype="int64").tolist()[0], + pd.Series([1, 2], dtype="Int64").tolist()[0], + pd.Series([1, 2], dtype="int64").to_dict()[0], + pd.Series([1, 2], dtype="Int64").to_dict()[0], + list(pd.Series([1, 2], dtype="int64").iteritems())[0][1], + list(pd.Series([1, 2], dtype="Int64").iteritems())[0][1], + list(iter(pd.Series([1, 2], dtype="int64")))[0], + list(iter(pd.Series([1, 2], dtype="Int64")))[0], + ], +) +def test_integer_Series_iter_return_native(data): + # GH 29738 + assert isinstance(data, int) @pytest.mark.parametrize( From a5d64c4a049e5b853a6f2470fe30271e48a9fd7e Mon Sep 17 00:00:00 2001 From: Rushabh Vasani Date: Sun, 9 Feb 2020 17:40:59 +0530 Subject: [PATCH 6/6] add whatsnew --- doc/source/whatsnew/v1.1.0.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/source/whatsnew/v1.1.0.rst b/doc/source/whatsnew/v1.1.0.rst index d0644fbb7ef54..48397e85c5ddd 100644 --- a/doc/source/whatsnew/v1.1.0.rst +++ b/doc/source/whatsnew/v1.1.0.rst @@ -197,7 +197,7 @@ Sparse ExtensionArray ^^^^^^^^^^^^^^ -- +- integer EA will now return objects of native type only when iterated. (:issue:`29738`) -