Skip to content

more informative error message with np.min or np.max on unordered Categorical #34053

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 7 commits into from
May 19, 2020
1 change: 1 addition & 0 deletions doc/source/whatsnew/v1.1.0.rst
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,7 @@ Other
- Bug in :meth:`DataFrame.__dir__` caused a segfault when using unicode surrogates in a column name (:issue:`25509`)
- Bug in :meth:`DataFrame.plot.scatter` caused an error when plotting variable marker sizes (:issue:`32904`)
- :class:`IntegerArray` now implements the ``sum`` operation (:issue:`33172`)
- More informative error message with ``np.min`` or ``np.max`` on unordered :class:`Categorical` (:issue:`33115`)

.. ---------------------------------------------------------------------------

Expand Down
6 changes: 4 additions & 2 deletions pandas/core/arrays/categorical.py
Original file line number Diff line number Diff line change
Expand Up @@ -2079,7 +2079,7 @@ def _reduce(self, name, axis=0, **kwargs):
return func(**kwargs)

@deprecate_kwarg(old_arg_name="numeric_only", new_arg_name="skipna")
def min(self, skipna=True):
def min(self, skipna=True, **kwargs):
"""
The minimum value of the object.

Expand All @@ -2098,6 +2098,7 @@ def min(self, skipna=True):
-------
min : the minimum of this `Categorical`
"""
# TODO: validate kwargs
self.check_for_ordered("min")

if not len(self._codes):
Expand All @@ -2114,7 +2115,7 @@ def min(self, skipna=True):
return self.categories[pointer]

@deprecate_kwarg(old_arg_name="numeric_only", new_arg_name="skipna")
def max(self, skipna=True):
def max(self, skipna=True, **kwargs):
"""
The maximum value of the object.

Expand All @@ -2133,6 +2134,7 @@ def max(self, skipna=True):
-------
max : the maximum of this `Categorical`
"""
# TODO: validate kwargs
self.check_for_ordered("max")

if not len(self._codes):
Expand Down
12 changes: 12 additions & 0 deletions pandas/tests/arrays/categorical/test_analytics.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import re
import sys

import numpy as np
Expand Down Expand Up @@ -93,6 +94,17 @@ def test_deprecate_numeric_only_min_max(self, method):
with tm.assert_produces_warning(expected_warning=FutureWarning):
getattr(cat, method)(numeric_only=True)

@pytest.mark.parametrize("method", ["min", "max"])
def test_numpy_min_max_raises(self, method):
cat = Categorical(["a", "b", "c", "b"], ordered=False)
msg = (
f"Categorical is not ordered for operation {method}\n"
"you can use .as_ordered() to change the Categorical to an ordered one"
)
method = getattr(np, method)
with pytest.raises(TypeError, match=re.escape(msg)):
method(cat)

@pytest.mark.parametrize(
"values,categories,exp_mode",
[
Expand Down