From 2a8a8e5ed70233d7709499906a4b478c62ab12b6 Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Mon, 2 Apr 2018 06:10:53 -0500 Subject: [PATCH 1/3] BUG: Fixed Series.align(frame) with ExtensionArray Closes https://github.com/pandas-dev/pandas/issues/20576 --- pandas/core/dtypes/cast.py | 3 ++- pandas/tests/extension/base/reshaping.py | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/pandas/core/dtypes/cast.py b/pandas/core/dtypes/cast.py index d19f19b7224a7..75434fcc2b40d 100644 --- a/pandas/core/dtypes/cast.py +++ b/pandas/core/dtypes/cast.py @@ -12,6 +12,7 @@ is_complex, is_datetimetz, is_categorical_dtype, is_datetimelike, is_extension_type, + is_extension_array_dtype, is_object_dtype, is_datetime64tz_dtype, is_datetime64_dtype, is_datetime64_ns_dtype, @@ -329,7 +330,7 @@ def maybe_promote(dtype, fill_value=np.nan): dtype = np.object_ # in case we have a string that looked like a number - if is_categorical_dtype(dtype): + if is_extension_array_dtype(dtype): pass elif is_datetimetz(dtype): pass diff --git a/pandas/tests/extension/base/reshaping.py b/pandas/tests/extension/base/reshaping.py index 6f4d5b40515be..b1d0aa4ac30d6 100644 --- a/pandas/tests/extension/base/reshaping.py +++ b/pandas/tests/extension/base/reshaping.py @@ -1,4 +1,5 @@ import pytest +import numpy as np import pandas as pd from pandas.core.internals import ExtensionBlock @@ -64,6 +65,20 @@ def test_align_frame(self, data, na_value): self.assert_frame_equal(r1, e1) self.assert_frame_equal(r2, e2) + def test_align_series_frame(self, data, na_value): + # /Users/taugspurger/sandbox/pandas-ip/pandas/pandas/tests/extension/base/reshaping.py + # https://github.com/pandas-dev/pandas/issues/20576 + ser = pd.Series(data[:3], name='a') + df = pd.DataFrame({"col": np.arange(4)}) + r1, r2 = ser.align(df) + + e1 = pd.Series( + data._constructor_from_sequence(list(data[:3]) + [na_value]), + name=ser.name) + + self.assert_series_equal(r1, e1) + self.assert_frame_equal(r2, df) + def test_set_frame_expand_regular_with_extension(self, data): df = pd.DataFrame({"A": [1] * len(data)}) df['B'] = data From 6a88aa5edaa8e1f201dd92b74a6221ab6a5c03c9 Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Mon, 2 Apr 2018 06:46:06 -0500 Subject: [PATCH 2/3] Skip test for Categorical --- pandas/tests/extension/category/test_categorical.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pandas/tests/extension/category/test_categorical.py b/pandas/tests/extension/category/test_categorical.py index 7528299578326..e75797ee478bf 100644 --- a/pandas/tests/extension/category/test_categorical.py +++ b/pandas/tests/extension/category/test_categorical.py @@ -75,6 +75,10 @@ def test_align(self, data, na_value): def test_align_frame(self, data, na_value): pass + @pytest.mark.skip(reason="Unobserved categories preseved in concat.") + def test_align_series_frame(self, data, na_value): + pass + class TestGetitem(base.BaseGetitemTests): @pytest.mark.skip(reason="Backwards compatibility") From c26c4541fae0d0d9a0a8b7296583e8967f9dd635 Mon Sep 17 00:00:00 2001 From: Tom Augspurger Date: Mon, 2 Apr 2018 08:27:09 -0500 Subject: [PATCH 3/3] Adjust for Categorical --- pandas/tests/extension/base/reshaping.py | 7 +++---- pandas/tests/extension/category/test_categorical.py | 4 ---- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/pandas/tests/extension/base/reshaping.py b/pandas/tests/extension/base/reshaping.py index b1d0aa4ac30d6..efc22c19a3eef 100644 --- a/pandas/tests/extension/base/reshaping.py +++ b/pandas/tests/extension/base/reshaping.py @@ -66,14 +66,13 @@ def test_align_frame(self, data, na_value): self.assert_frame_equal(r2, e2) def test_align_series_frame(self, data, na_value): - # /Users/taugspurger/sandbox/pandas-ip/pandas/pandas/tests/extension/base/reshaping.py # https://github.com/pandas-dev/pandas/issues/20576 - ser = pd.Series(data[:3], name='a') - df = pd.DataFrame({"col": np.arange(4)}) + ser = pd.Series(data, name='a') + df = pd.DataFrame({"col": np.arange(len(ser) + 1)}) r1, r2 = ser.align(df) e1 = pd.Series( - data._constructor_from_sequence(list(data[:3]) + [na_value]), + data._constructor_from_sequence(list(data) + [na_value]), name=ser.name) self.assert_series_equal(r1, e1) diff --git a/pandas/tests/extension/category/test_categorical.py b/pandas/tests/extension/category/test_categorical.py index e75797ee478bf..7528299578326 100644 --- a/pandas/tests/extension/category/test_categorical.py +++ b/pandas/tests/extension/category/test_categorical.py @@ -75,10 +75,6 @@ def test_align(self, data, na_value): def test_align_frame(self, data, na_value): pass - @pytest.mark.skip(reason="Unobserved categories preseved in concat.") - def test_align_series_frame(self, data, na_value): - pass - class TestGetitem(base.BaseGetitemTests): @pytest.mark.skip(reason="Backwards compatibility")