From 4fd3202ff8964c01674cd75f1d16217815e34c30 Mon Sep 17 00:00:00 2001 From: JustinZhengBC Date: Fri, 19 Oct 2018 00:29:46 -0700 Subject: [PATCH 1/4] BUG-23224 Allow integer_array to be initialized with all None --- pandas/core/arrays/integer.py | 8 ++++++-- pandas/tests/arrays/test_integer.py | 9 +++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/pandas/core/arrays/integer.py b/pandas/core/arrays/integer.py index 9917045f2f7d2..1e410844cf1c2 100644 --- a/pandas/core/arrays/integer.py +++ b/pandas/core/arrays/integer.py @@ -174,8 +174,12 @@ def coerce_to_array(values, dtype, mask=None, copy=False): inferred_type = infer_dtype(values) if inferred_type not in ['floating', 'integer', 'mixed-integer', 'mixed-integer-float']: - raise TypeError("{} cannot be converted to an IntegerDtype".format( - values.dtype)) + if inferred_type is 'mixed' and all(isna(x) for x in values): + values = np.array([np.nan] * len(values)) # GH 23224 + else: + raise TypeError( + "{} cannot be converted to an IntegerDtype".format( + values.dtype)) elif not (is_integer_dtype(values) or is_float_dtype(values)): raise TypeError("{} cannot be converted to an IntegerDtype".format( diff --git a/pandas/tests/arrays/test_integer.py b/pandas/tests/arrays/test_integer.py index 23ee8d217bd59..ce915339b8993 100644 --- a/pandas/tests/arrays/test_integer.py +++ b/pandas/tests/arrays/test_integer.py @@ -560,6 +560,15 @@ def test_to_integer_array_float(): assert result.dtype == Int64Dtype() +@pytest.mark.parametrize( + 'result, expected', + [ + (integer_array([None]), integer_array([np.nan])), + (integer_array([None, np.nan]), integer_array([np.nan, np.nan]))]) +def test_to_integer_array_none(result, expected): + tm.assert_extension_array_equal(result, expected) + + @pytest.mark.parametrize( 'values, to_dtype, result_dtype', [ From 0590df8e81c8ebf47973fa6faea1ad7a43513b34 Mon Sep 17 00:00:00 2001 From: JustinZhengBC Date: Fri, 19 Oct 2018 11:59:42 -0700 Subject: [PATCH 2/4] BUG-23224 Add tests and other requested changes --- pandas/core/arrays/integer.py | 14 ++++++-------- pandas/tests/arrays/test_integer.py | 6 ++++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/pandas/core/arrays/integer.py b/pandas/core/arrays/integer.py index 1e410844cf1c2..ffb9bf55502e1 100644 --- a/pandas/core/arrays/integer.py +++ b/pandas/core/arrays/integer.py @@ -172,14 +172,12 @@ def coerce_to_array(values, dtype, mask=None, copy=False): values = np.array(values, copy=copy) if is_object_dtype(values): inferred_type = infer_dtype(values) - if inferred_type not in ['floating', 'integer', - 'mixed-integer', 'mixed-integer-float']: - if inferred_type is 'mixed' and all(isna(x) for x in values): - values = np.array([np.nan] * len(values)) # GH 23224 - else: - raise TypeError( - "{} cannot be converted to an IntegerDtype".format( - values.dtype)) + if inferred_type is 'mixed' and isna(values).any(): + values = np.array([np.nan] * len(values)) # GH 23224 + elif inferred_type not in ['floating', 'integer', + 'mixed-integer', 'mixed-integer-float']: + raise TypeError("{} cannot be converted to an IntegerDtype".format( + values.dtype)) elif not (is_integer_dtype(values) or is_float_dtype(values)): raise TypeError("{} cannot be converted to an IntegerDtype".format( diff --git a/pandas/tests/arrays/test_integer.py b/pandas/tests/arrays/test_integer.py index ce915339b8993..72de9c5c46245 100644 --- a/pandas/tests/arrays/test_integer.py +++ b/pandas/tests/arrays/test_integer.py @@ -519,7 +519,8 @@ def test_integer_array_constructor_copy(): 1, 1.0, pd.date_range('20130101', periods=2), - np.array(['foo'])]) + np.array(['foo']), + [[1, 2], [3, 4]]]) def test_to_integer_array_error(values): # error in converting existing arrays to IntegerArrays with pytest.raises(TypeError): @@ -564,7 +565,8 @@ def test_to_integer_array_float(): 'result, expected', [ (integer_array([None]), integer_array([np.nan])), - (integer_array([None, np.nan]), integer_array([np.nan, np.nan]))]) + (integer_array([None, np.nan]), integer_array([np.nan, np.nan])), + (integer_array([np.nan, np.nan]), integer_array([np.nan, np.nan]))]) def test_to_integer_array_none(result, expected): tm.assert_extension_array_equal(result, expected) From 349ca0a84e31ed21b9bf5db3dec423c34971eac7 Mon Sep 17 00:00:00 2001 From: JustinZhengBC Date: Fri, 19 Oct 2018 13:23:14 -0700 Subject: [PATCH 3/4] Fix existing tests --- pandas/tests/arrays/test_integer.py | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/pandas/tests/arrays/test_integer.py b/pandas/tests/arrays/test_integer.py index f7d7939683ebe..e6dae0ffaec28 100644 --- a/pandas/tests/arrays/test_integer.py +++ b/pandas/tests/arrays/test_integer.py @@ -527,9 +527,9 @@ def test_integer_array_constructor(): @pytest.mark.parametrize('a, b', [ ([1, None], [1, np.nan]), - pytest.param([None], [np.nan], - marks=pytest.mark.xfail(reason='GH-23224', - strict=True)), + ([None], [np.nan]), + ([None, np.nan], [np.nan, np.nan]), + ([np.nan, np.nan], [np.nan, np.nan]), ]) def test_integer_array_constructor_none_is_nan(a, b): result = integer_array(a) @@ -601,16 +601,6 @@ def test_to_integer_array_float(): assert result.dtype == Int64Dtype() -@pytest.mark.parametrize( - 'result, expected', - [ - (integer_array([None]), integer_array([np.nan])), - (integer_array([None, np.nan]), integer_array([np.nan, np.nan])), - (integer_array([np.nan, np.nan]), integer_array([np.nan, np.nan]))]) -def test_to_integer_array_none(result, expected): - tm.assert_extension_array_equal(result, expected) - - @pytest.mark.parametrize( 'values, to_dtype, result_dtype', [ From 14399b11230c37371f717b140010461d8a820080 Mon Sep 17 00:00:00 2001 From: Jeff Reback Date: Mon, 22 Oct 2018 23:05:54 -0400 Subject: [PATCH 4/4] use idiomatic --- pandas/core/arrays/integer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandas/core/arrays/integer.py b/pandas/core/arrays/integer.py index c178830dc444a..17e92c3976e2c 100644 --- a/pandas/core/arrays/integer.py +++ b/pandas/core/arrays/integer.py @@ -174,7 +174,8 @@ def coerce_to_array(values, dtype, mask=None, copy=False): if is_object_dtype(values): inferred_type = lib.infer_dtype(values) if inferred_type is 'mixed' and isna(values).any(): - values = np.array([np.nan] * len(values)) # GH 23224 + values = np.empty(len(values)) + values.fill(np.nan) elif inferred_type not in ['floating', 'integer', 'mixed-integer', 'mixed-integer-float']: raise TypeError("{} cannot be converted to an IntegerDtype".format(