From 157720c0cd911ba79d57f0628d70158e3f938423 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Thu, 9 Nov 2017 16:32:55 -0800 Subject: [PATCH 1/3] raise if values passed to Categorical is a DataFrame --- pandas/core/categorical.py | 7 ++++++- pandas/tests/test_categorical.py | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pandas/core/categorical.py b/pandas/core/categorical.py index 1e3c8f89c0e05..9cf264a1fbf50 100644 --- a/pandas/core/categorical.py +++ b/pandas/core/categorical.py @@ -9,7 +9,7 @@ from pandas._libs import lib, algos as libalgos from pandas.core.dtypes.generic import ( - ABCSeries, ABCIndexClass, ABCCategoricalIndex) + ABCDataFrame, ABCSeries, ABCIndexClass, ABCCategoricalIndex) from pandas.core.dtypes.missing import isna, notna from pandas.core.dtypes.cast import ( maybe_infer_to_datetimelike, @@ -308,6 +308,9 @@ def __init__(self, values, categories=None, ordered=None, dtype=None, elif isinstance(values, (ABCIndexClass, ABCSeries)): # we'll do inference later pass + elif isinstance(values, ABCDataFrame): + raise TypeError("> 1 ndim Categorical are not " + "supported at this time") else: @@ -2331,6 +2334,8 @@ def _factorize_from_iterable(values): categories=values.categories, ordered=values.ordered) codes = values.codes + elif isinstance(values, ABCDataFrame): + raise TypeError('Factorizing DataFrame is not supported.') else: cat = Categorical(values, ordered=True) categories = cat.categories diff --git a/pandas/tests/test_categorical.py b/pandas/tests/test_categorical.py index b77e2d1dcda8a..bdc77732012c5 100644 --- a/pandas/tests/test_categorical.py +++ b/pandas/tests/test_categorical.py @@ -173,6 +173,12 @@ def test_constructor_unsortable(self): pytest.raises( TypeError, lambda: Categorical(arr, ordered=True)) + def test_constructor_dataframe_error(self): + # GH#17112 + df = pd.DataFrame(np.random.randn(3, 2), columns=['A', 'B']) + with pytest.raises(TypeError): + Categorical(df) + def test_constructor_interval(self): result = Categorical([Interval(1, 2), Interval(2, 3), Interval(3, 6)], ordered=True) From 5f4ef4b2b24678260a9f709b7d652da1b73b3d9a Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Thu, 9 Nov 2017 17:36:48 -0800 Subject: [PATCH 2/3] change condition check per reviewer suggestion --- pandas/core/categorical.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/core/categorical.py b/pandas/core/categorical.py index 9cf264a1fbf50..a3d49273d6c37 100644 --- a/pandas/core/categorical.py +++ b/pandas/core/categorical.py @@ -9,7 +9,7 @@ from pandas._libs import lib, algos as libalgos from pandas.core.dtypes.generic import ( - ABCDataFrame, ABCSeries, ABCIndexClass, ABCCategoricalIndex) + ABCSeries, ABCIndexClass, ABCCategoricalIndex) from pandas.core.dtypes.missing import isna, notna from pandas.core.dtypes.cast import ( maybe_infer_to_datetimelike, @@ -308,7 +308,7 @@ def __init__(self, values, categories=None, ordered=None, dtype=None, elif isinstance(values, (ABCIndexClass, ABCSeries)): # we'll do inference later pass - elif isinstance(values, ABCDataFrame): + elif getattr(values, 'ndim', 0) > 1: raise TypeError("> 1 ndim Categorical are not " "supported at this time") @@ -2334,7 +2334,7 @@ def _factorize_from_iterable(values): categories=values.categories, ordered=values.ordered) codes = values.codes - elif isinstance(values, ABCDataFrame): + elif getattr(values, 'ndim', 0) > 1: raise TypeError('Factorizing DataFrame is not supported.') else: cat = Categorical(values, ordered=True) From b0da08410786f11f4860a7c8c8ec195ea9599cf6 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Thu, 9 Nov 2017 22:23:23 -0800 Subject: [PATCH 3/3] use NotImplementedError per reviewer suggestion --- pandas/core/categorical.py | 6 +++--- pandas/tests/test_categorical.py | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pandas/core/categorical.py b/pandas/core/categorical.py index a3d49273d6c37..b55c02a166754 100644 --- a/pandas/core/categorical.py +++ b/pandas/core/categorical.py @@ -309,8 +309,8 @@ def __init__(self, values, categories=None, ordered=None, dtype=None, # we'll do inference later pass elif getattr(values, 'ndim', 0) > 1: - raise TypeError("> 1 ndim Categorical are not " - "supported at this time") + raise NotImplementedError("> 1 ndim Categorical are not " + "supported at this time") else: @@ -2335,7 +2335,7 @@ def _factorize_from_iterable(values): ordered=values.ordered) codes = values.codes elif getattr(values, 'ndim', 0) > 1: - raise TypeError('Factorizing DataFrame is not supported.') + raise NotImplementedError('Factorizing DataFrame is not supported.') else: cat = Categorical(values, ordered=True) categories = cat.categories diff --git a/pandas/tests/test_categorical.py b/pandas/tests/test_categorical.py index bdc77732012c5..d6221cc48bc1e 100644 --- a/pandas/tests/test_categorical.py +++ b/pandas/tests/test_categorical.py @@ -176,7 +176,7 @@ def test_constructor_unsortable(self): def test_constructor_dataframe_error(self): # GH#17112 df = pd.DataFrame(np.random.randn(3, 2), columns=['A', 'B']) - with pytest.raises(TypeError): + with pytest.raises(NotImplementedError): Categorical(df) def test_constructor_interval(self):