Skip to content

Commit 66fa067

Browse files
committed
BUG: fix numpy min/max compat with integer index (pandas-dev#26125)
1 parent f53bb06 commit 66fa067

File tree

3 files changed

+65
-6
lines changed

3 files changed

+65
-6
lines changed

pandas/core/base.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -966,7 +966,7 @@ def _ndarray_values(self) -> np.ndarray:
966966
def empty(self):
967967
return not self.size
968968

969-
def max(self, axis=None, skipna=True):
969+
def max(self, axis=None, skipna=True, *args, **kwargs):
970970
"""
971971
Return the maximum value of the Index.
972972
@@ -1004,9 +1004,10 @@ def max(self, axis=None, skipna=True):
10041004
('b', 2)
10051005
"""
10061006
nv.validate_minmax_axis(axis)
1007+
nv.validate_max(args, kwargs)
10071008
return nanops.nanmax(self._values, skipna=skipna)
10081009

1009-
def argmax(self, axis=None, skipna=True):
1010+
def argmax(self, axis=None, skipna=True, *args, **kwargs):
10101011
"""
10111012
Return an ndarray of the maximum argument indexer.
10121013
@@ -1021,9 +1022,10 @@ def argmax(self, axis=None, skipna=True):
10211022
numpy.ndarray.argmax
10221023
"""
10231024
nv.validate_minmax_axis(axis)
1025+
nv.validate_argmax_with_skipna(skipna, args, kwargs)
10241026
return nanops.nanargmax(self._values, skipna=skipna)
10251027

1026-
def min(self, axis=None, skipna=True):
1028+
def min(self, axis=None, skipna=True, *args, **kwargs):
10271029
"""
10281030
Return the minimum value of the Index.
10291031
@@ -1061,9 +1063,10 @@ def min(self, axis=None, skipna=True):
10611063
('a', 1)
10621064
"""
10631065
nv.validate_minmax_axis(axis)
1066+
nv.validate_min(args, kwargs)
10641067
return nanops.nanmin(self._values, skipna=skipna)
10651068

1066-
def argmin(self, axis=None, skipna=True):
1069+
def argmin(self, axis=None, skipna=True, *args, **kwargs):
10671070
"""
10681071
Return a ndarray of the minimum argument indexer.
10691072
@@ -1082,6 +1085,7 @@ def argmin(self, axis=None, skipna=True):
10821085
numpy.ndarray.argmin
10831086
"""
10841087
nv.validate_minmax_axis(axis)
1088+
nv.validate_argmax_with_skipna(skipna, args, kwargs)
10851089
return nanops.nanargmin(self._values, skipna=skipna)
10861090

10871091
def tolist(self):

pandas/core/indexes/range.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,14 +322,16 @@ def _minmax(self, meth):
322322

323323
return self._start + self._step * no_steps
324324

325-
def min(self, axis=None, skipna=True):
325+
def min(self, axis=None, skipna=True, *args, **kwargs):
326326
"""The minimum value of the RangeIndex"""
327327
nv.validate_minmax_axis(axis)
328+
nv.validate_min(args, kwargs)
328329
return self._minmax('min')
329330

330-
def max(self, axis=None, skipna=True):
331+
def max(self, axis=None, skipna=True, *args, **kwargs):
331332
"""The maximum value of the RangeIndex"""
332333
nv.validate_minmax_axis(axis)
334+
nv.validate_max(args, kwargs)
333335
return self._minmax('max')
334336

335337
def argsort(self, *args, **kwargs):

pandas/tests/reductions/test_reductions.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,59 @@ def test_minmax_nat_datetime64(self, op):
319319
obj = DatetimeIndex([pd.NaT, pd.NaT, pd.NaT])
320320
assert pd.isna(getattr(obj, op)())
321321

322+
def test_numpy_minmax_integer(self):
323+
# GH#26125
324+
idx = Index([1, 2, 3])
325+
326+
expected = idx.values.max()
327+
result = np.max(idx)
328+
assert result == expected
329+
330+
expected = idx.values.min()
331+
result = np.min(idx)
332+
assert result == expected
333+
334+
errmsg = "the 'out' parameter is not supported"
335+
with pytest.raises(ValueError, match=errmsg):
336+
np.min(idx, out=0)
337+
with pytest.raises(ValueError, match=errmsg):
338+
np.max(idx, out=0)
339+
340+
expected = idx.values.argmax()
341+
result = np.argmax(idx)
342+
assert result == expected
343+
344+
expected = idx.values.argmin()
345+
result = np.argmin(idx)
346+
assert result == expected
347+
348+
errmsg = "the 'out' parameter is not supported"
349+
with pytest.raises(ValueError, match=errmsg):
350+
np.argmin(idx, out=0)
351+
with pytest.raises(ValueError, match=errmsg):
352+
np.argmax(idx, out=0)
353+
354+
def test_numpy_minmax_range(self):
355+
# GH#26125
356+
idx = RangeIndex(0, 10, 3)
357+
358+
expected = idx._int64index.max()
359+
result = np.max(idx)
360+
assert result == expected
361+
362+
expected = idx._int64index.min()
363+
result = np.min(idx)
364+
assert result == expected
365+
366+
errmsg = "the 'out' parameter is not supported"
367+
with pytest.raises(ValueError, match=errmsg):
368+
np.min(idx, out=0)
369+
with pytest.raises(ValueError, match=errmsg):
370+
np.max(idx, out=0)
371+
372+
# No need to test again argmax/argmin compat since the implementation
373+
# is the same as basic integer index
374+
322375
def test_numpy_minmax_datetime64(self):
323376
dr = pd.date_range(start='2016-01-15', end='2016-01-20')
324377

0 commit comments

Comments
 (0)